mysql使用内存溢出_Mysql 查询返回大量数据导致内存溢出

原因

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

?code=ed011d679d8dd270e180fb0461e15b4e_8f118824ce50c961_boxcnxfSAcbzIH6qFUKuVw4DVie_IZCsWCQEPei4tbqaEJLAXjytud3mPaEk

?code=826431b9c6deeaf72b05555746384e7b_8f118824ce50c961_boxcnE4z4qRGmgeVg5GHT1dl4kb_MxTKIPI5dgKJ3HYYChMzcYdhr5PaOjLp

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);

?code=c4ec863074afb00128a383e8f09dfd24_8f118824ce50c961_boxcnvQRoWxAS9zb2F2LCGM7Hef_snmDWd83DUApp12erEZFvLRLAs2Musvd

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

?code=eb08a3d75a42cbd66f0118f4f92e11da_8f118824ce50c961_boxcnRuuxc2yP2seHdgk6UShNGg_NxXaAHCpJtlDlZaNCk31f5t7zNjAyZkT

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

?code=b46c71c12f37f983619612249398cea3_8f118824ce50c961_boxcnkNG7CPC1IbYfgyzGKGe4he_nFdLKx0ssCnyPJxnEEfVTLCrqvXP7XWS

现象

产线断线

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

解决办法

杀掉查询语句:发现杀掉了还有新的,原因是rabbitmq有确认和重发机制,收不到回复消息,会重新发送。-----不可行

通过Rabbitmq》queue》purge message清除队列的所有消息,有风险-----一般不可行。

修改sql语句( select .... where false),然后杀掉正在进行的mysql查询线程,下一次查询时为即可发送正常结果。

由于material_name 和machine_name 都不是索引,这个功能影响性能,一般不能做,除非停机加索引,或者分页查询。

?code=ae9acdd8e0da3bdbf40fa10ec54431c2_8f118824ce50c961_boxcnOSfQe592dL3MVFUO470kzd_XpACrmVgKIPxwAcoHvAKDc2WBVi8o8v2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值