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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM