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倍!