首页 新闻 会员 周边

mysql 为什么order by limit 查询数据较少时不使用正确的索引?

0
悬赏园豆:20 [已解决问题] 解决于 2023-04-07 11:51

版本:mysql-5.6.17
我有个90万条数据的表,其中有2字段ID和Time分别设置了2个索引,一个Time,一个ID_Time联合索引
我有个查询语句,select * from table where ID=?ID order by Time desc limit 1;
这个语句怎么看怎么没问题,但是。。。实际运行中,它根本就不用ID_Time索引,而是选择了Time,结果查询一次耗时39秒!简直疯了啊
当我强制其使用ID_Time索引时,只需要0.004秒就查询出来了。。。
而且我还发现一个诡异的现象
当我把limit的数值变大后,它就用ID_Time索引了!
比如select * from table where ID=?ID order by Time desc limit 1000,查询只需要0.844秒
经过我不断的测试,我发现在limit 106时用Time索引,而limit 107时则用正确的ID_Time索引,
这是什么鬼啊,为什么会有这么奇葩的机制啊,网上也没找到相关的文章,哟没有大佬解个惑啊

WmW的主页 WmW | 菜鸟二级 | 园豆:424
提问于:2023-04-03 15:51
< >
分享
最佳答案
0

SQL优化器会优先选择某个它认为最优的索引,你的表又3个索引,而且你的SQL语句中貌似都能用,索引只能用一个,优化器也很无奈啊

收获园豆:20
56180825 | 小虾三级 |园豆:1756 | 2023-04-03 20:59

看来之后要自己指定索引,不能相信优化器了

WmW | 园豆:424 (菜鸟二级) | 2023-04-04 17:30

@WmW: 也不是,是你设置了太多索引了,你只设置一个索引试下

56180825 | 园豆:1756 (小虾三级) | 2023-04-04 19:38

@56180825: 哦哦

WmW | 园豆:424 (菜鸟二级) | 2023-04-06 18:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册