查看mysql挂起情况_MySQL查询随机挂起“发送数据”状态?

博客作者通过Masood Alam的建议,使用SHOW ENGINE INNODB STATUS解决了MySQL查询随机挂起的问题。问题出在user_id特定值上的查询处理方式导致不可预测的行为。通过调整查询语句,优化了JOIN操作,减少了'发送数据'状态的挂起。新的查询语句在EXPLAIN分析中表现出更好的执行计划。
摘要由CSDN通过智能技术生成

哇,感谢Masood Alam的评论,我发现并解决了这个问题.

使用SHOW ENGINE INNODB STATUS在调试方面非常有用.

事实证明,对于user_id的某些值,数据库以不同的方式处理事物,因此其不可预测的行为并且无法重现问题.通过status命令,我能够复制并粘贴当前正在运行的确切查询.

这是针对user_id的特定值的EXPLAIN的结果:

Id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 841 |

1 | SIMPLE | b | index_merge | user_id,year,test_id | user_id,year | 4,4 | NULL | 13 | Using intersect(user_id,year); Using where

现在的后续问题是如何解释这种行为.但是,为我解决问题只是将查询更改为:

SELECT a.prefix, a.test_id, a.method_id, b.test_id

FROM a

LEFT JOIN b ON b.test_id = a.test_id

WHERE

b.id IS NULL

OR user_id = ?

AND year = ?

其中EXPLAIN的结果是:

Id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 671 |

1 | SIMPLE | b | ref | test_id | test_id | 4 | db.a.test_id | 49 | Using where

现在我知道,InnoDB可以有不同的方法来执行给定不同输入值的查询.为什么?我还是不知道.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值