如:
select * from table where status=4 order by create_time desc limit 20,20
这样查询会导致数据库直接卡着,没结果出来。 如果把 order by create_time desc去掉,就秒出来。
后来不断尝试发现,只有当分页到最后一页,数据不满足20条的时候就会这样。否则还是很快。 这张表的记录条数是300w。
如:
select * from table where status=4 order by create_time desc limit 20,20
这样查询会导致数据库直接卡着,没结果出来。 如果把 order by create_time desc去掉,就秒出来。
后来不断尝试发现,只有当分页到最后一页,数据不满足20条的时候就会这样。否则还是很快。 这张表的记录条数是300w。
(status, create_time)建复合索引
单排序字段加索引也是要扫全表的,只不过是因为你有limit没有扫描全部记录而已
另外只有最后一页才慢你要看下是不是按照时间排序以后最后一部分status=4的记录很少
如果很少的话就意味着mysql需要扫描大量的记录才找到几条满足条件的记录
这也是数据分布不均衡会导致执行计划不准的原因
5 回答3.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
2 回答1.8k 阅读
3 回答2k 阅读
1 回答3.6k 阅读
(status, create_time)
有索引就会快很多的。没索引的话就是全表扫描,在所有结果集中做排序(排序可是O(n log n)量级的),记录多了就不可忍受。