mysql分页查询,排序列不是主键的查询性能优化

mysql分页通常会使用LIMIT加上偏移量,有需要时还会加上ORDER BY。如果ORDER BY有对应的索引,分页效率会

不错,否则,MySQL大数据量时就出慢查询。

在偏移量非常大的时候,例如可能是LIMIT 20000,10这样的查询,这时MySQL需要查询20010条记录后只返回最后10

条,前面20000条记录都将被抛弃,这样的代价非常高。如果所有的页面被访问的频率都相同,那么这样的查询可能需

要访问半个表的数据。要优化这种查询,要么是在页面中限制分页的数量,要么是优化大偏移量的性能。

最简单的办法就是尽可能地使用索引覆盖扫描,而不是全表扫描。然后根据需要做一次关联操作再返回所需的列。

对于偏移量很大的时候,这样的效率会提升非常大。

测试场景:

机器:32核,32G,2TB(RAID0,2蝶盘,单盘1TB)

数据库:mysql

数据量:3W

通常做法:

SELECT * FROM article ORDER BY pub_time desc LIMIT 20000,10;  --->耗时:0.053秒

改进做法:

SELECT * FROM article
INNER JOIN (
SELECT id FROM article ORDER BY pub_time desc LIMIT 20000,10
) AS t USING(id); ---->耗时:0.010秒

性能提升5倍!

疯狂测试,700w数据,性能提升近100倍!

 

觉得好的话记得打赏赞助小灰灰哦,小灰灰灰更有动力的,谢谢

小灰灰

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: