mysql order by limit 索引不命中问题

发布时间 2023-04-11 10:59:37作者: WmW

我有一个表,里面有2个字段,大概类似 UserID 和 Time 

我有个查询语句A: select * from table where UserID=?UserID order by Time desc limit 1;

因此设置了一个联合索引 UserID_Time

又因为有根据时间查询数据的需求 B:select * from table where Time>?Time

因此又单独设置了一个Time索引

结果就出现了一个诡异的事情

当我查询A时,mysql的索引优化器并不会选择UserID_Time,而是选择了Time索引,查询耗时39秒

当我强制其使用UserID_Time后,只需要0.004秒就查询出来了,很明显它未命中正确的索引

而且我还发现一个诡异的现象
当我把limit的数值变大后,它就用UserID_Time索引了
经过我不断的测试,我发现在limit 106时用Time索引,而limit 107时则用正确的ID_Time索引

 

貌似索引优化器不是很靠谱,当查询语句中有 where 条件,又有order by 的时候,它会优先使用order by的索引

因此不能太信任索引优化器,对于一些sql语句,还是需要自己指定索引