Smail_的gravatar头像
Smail_ 2017-05-17 08:52:22
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倍!


打赏
最近浏览
JoyKinG  LV19 2019年3月13日
ssaa110119  LV1 2018年10月22日
linshuqing  LV1 2018年8月25日
易新城  LV11 2018年8月12日
chenhaoxiang  LV2 2018年5月6日
pursol  LV3 2018年2月25日
coding喵  LV16 2017年11月19日
贾大神  LV5 2017年11月7日
373717096  LV17 2017年9月22日
hucongjun 2017年9月14日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友