Mysql 查詢返回大量資料導致記憶體溢位
阿新 • • 發佈:2020-10-29
原因
MES 專案中查詢裝置使用了哪些物料。job_product_component的machine_name 和material_name 既不是主鍵也不是索引。表的大小如下圖所示
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);
explain SELECT * FROM job_product_component WHERE IF(@machinename IS NULL, 1, machine_name = @machinename) and component_name =@materialname;
explain SELECT * FROM job_product_component WHERE machine_name =@machinename and component_name =@materialname;
現象
- 產線斷線
- 通過檢視CPU,發現CPU瘋漲,伺服器記憶體溢位
解決辦法
- 殺掉查詢語句:發現殺掉了還有新的,原因是rabbitmq有確認和重發機制,收不到回覆訊息,會重新發送。-----不可行
- 通過Rabbitmq》queue》purge message清除佇列的所有訊息,有風險-----一般不可行。
- 修改sql語句( select .... where false),然後殺掉正在進行的mysql查詢執行緒,下一次查詢時為即可傳送正常結果。
- 由於material_name 和machine_name 都不是索引,這個功能影響效能,一般不能做,除非停機加索引,或者分頁查詢。