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