版本: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索引,
这是什么鬼啊,为什么会有这么奇葩的机制啊,网上也没找到相关的文章,哟没有大佬解个惑啊
SQL优化器会优先选择某个它认为最优的索引,你的表又3个索引,而且你的SQL语句中貌似都能用,索引只能用一个,优化器也很无奈啊
看来之后要自己指定索引,不能相信优化器了
@WmW: 也不是,是你设置了太多索引了,你只设置一个索引试下
@56180825: 哦哦