mysql limit 没用索引_mysql的limit影响sql使用的索引的选择 ?

接口中的SQL查询在使用LIMIT时出现性能问题,原本在enterpriseId和timeModified上都有索引,但查询却选择了timeModified作为索引,导致扫描大量行。去掉LIMIT后,查询选择了更优的enterpriseId索引。经过分析和尝试,通过嵌套查询解决了这个问题,揭示了LIMIT可能影响索引选择的现象。
摘要由CSDN通过智能技术生成

前些天,测试人员向我反映有一家企业的通讯录同步接口不返回数据,我查日志

7a06a0dd5e0984bdb3d8224ad6332e94.png

nginx的相应access.log状态码是499,请求超时,从网上查找资料分析有两种可能:

1.客户端主动断开连接

2.服务端响应超时造成客户端连接中断

问了客户端的开发人员,他们说他们设置响应超时时间为5秒,5s未返回则超时

再查服务器日志

发现整个接口耗时快6s多了

744dc9dfe8a52c20c5aa524d0f52abc6.png

但是这个接口里面调了两个别的服务的接口,具体还真不知道哪个接口耗时,于是我又在每一步接口的调用的前后加上耗时分析,等运维更新到线上,再查日志

4e06bf77e49fcca35c8b4735ed9a97f6.png

耗时5799ms, 等于说就是这个getPersonByContacts接口太耗时了

我直接找到该服务的项目,打开xml文件

SELECT

*

FROM Person WHERE enterpriseId = #{enterpriseId}

and timeModified >= #{timeModified}

ORDER BY timeModified ASC

limit #{batchNum}

发现sql是正常的sql,看表结构,enterpriseId和timeModified都加了相应的索引,但是为什么还是这么耗呢?

利用sql执行计划查看

4be76f04e1ae35dd42a441adae7059fb.png

用的索引是timeModified,竟然扫了200w+行,我一查整个表400w+数据,扫描了半张表... 能不慢麽?

我在想为什么用的是timeModified作为索引而不是enterpriseId呢?

05e89a34d4e8ddb5d7b754d9d4db2c5f.png

6bc89c8dca0cfb04e209ca42bf389b68.png

没加limit时是选择了enterpriseId,扫描的行数也才28000+行,这个肯定就不会慢了...

难道是limit影响了索引的选择?遇事不决还是要问度娘

42d91e7a837d384b828c02cb5bef775b.png

79c03f62050cbf1464ac447144d99c7c.png

利用题主说的强制索引试试

7c6ab2d707bfcc3c484700f6fb85e582.png

后面想了想是不是可以做个嵌套查询达到同样的选择enterpriseId的效果

c1aec1b8638eb274a55fb17befc9ee85.png

果然是可以的!学习了!排查问题也是一个很好的学习过程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值