zoukankan      html  css  js  c++  java
  • Mysql 查询返回大量数据导致内存溢出

    原因

    MES 项目中查询设备使用了哪些物料。job_product_component的machine_name 和material_name 既不是主键也不是索引。表的大小如下图所示

    img

    img

    Sql语句如下。当查询的machinename和materialname 参数都为null的时候返回的是全表数据。

    SELECT 
      *
    FROM
      job_product_component
    WHERE
      IF(@machinename IS NULL,
        1,
        machine_name = @machinename)
        AND IF(@materialname IS NULL,
        1,
        component_name = @materialname);
    

    explain SELECT * FROM job_product_component WHERE IF(@machinename IS NULL, 1, machine_name = @machinename) AND IF(@materialname IS NULL,1,component_name = @materialname);

    img

    explain SELECT * FROM job_product_component WHERE IF(@machinename IS NULL, 1, machine_name = @machinename) and component_name =@materialname;

    img

    explain SELECT * FROM job_product_component WHERE machine_name =@machinename and component_name =@materialname;

    img

    现象

    • 产线断线
    • 通过查看CPU,发现CPU疯涨,服务器内存溢出

    解决办法

    • 杀掉查询语句:发现杀掉了还有新的,原因是rabbitmq有确认和重发机制,收不到回复消息,会重新发送。-----不可行
    • 通过Rabbitmq》queue》purge message清除队列的所有消息,有风险-----一般不可行。
    • 修改sql语句( select .... where false),然后杀掉正在进行的mysql查询线程,下一次查询时为即可发送正常结果。
    • 由于material_name 和machine_name 都不是索引,这个功能影响性能,一般不能做,除非停机加索引,或者分页查询。

    img

    但愿人长久 千里共婵娟
  • 相关阅读:
    李白—烂尾楼题记
    [原创]网络图片延迟加载实现,超越jquery2010年3月26日
    利用反射,泛型,扩展方法快速获取表单值到实体类
    断点续传 到底是很么
    认识LINQ
    Gridview控件用法大总结
    网站性能优化总结。
    JQ小技巧
    自己写的jq_3个小插件
    MOSS中SPuser类的使用
  • 原文地址:https://www.cnblogs.com/hellcats/p/13895217.html
Copyright © 2011-2022 走看看