炫意html5
最早CSS3和HTML5移动技术网站之一

数据库查询按主键排序limit非常慢,结果集数量其实很少

SELECT *
FROM table lm
WHERE `lm`.`CreateTime` >= '2021-07-13'
AND `lm`.`CreateTime` <= '2021-07-13 23:59:59'
AND lm.GoodsId IN (224, 225, 272, 1224, 10011, 10007)
ORDER BY lm.`OrderID` desc
LIMIT 30;

explain计划

具体sql如上,CreateTime 和GoodsId有索引,OrderID是主键,总表2000w数据,通过条件筛选出来的数据只有20条,
但是通过OrderID排序,然后limit 的时候 就非常慢,需要十几秒,
尝试过几种其他情况,比如
修改排序字段为 CreateTime,或者OrderID, CreateTime,
或者修改Limit 后面的数量改为小于等于20的数,
去除limit或者去除order by
查询都很快。
实在没法理解这样的原因,按照mysql的执行顺序,order limit最后执行,我前面的结果集大小才20条,排序也是应该是排序这20条啊,使用limit后为什么会这么慢

回答

你看下他走的那个索引,
大概率是在走 OrderID 索引

炫意HTML5 » 数据库查询按主键排序limit非常慢,结果集数量其实很少

Java基础教程Android基础教程