1. 程式人生 > 實用技巧 >Mysql 查詢返回大量資料導致記憶體溢位

Mysql 查詢返回大量資料導致記憶體溢位

原因

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 都不是索引,這個功能影響效能,一般不能做,除非停機加索引,或者分頁查詢。