彻底搞明白大数据量下Mysql的分页优化
Posted hanruikai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了彻底搞明白大数据量下Mysql的分页优化相关的知识,希望对你有一定的参考价值。
1.背景
大家都知道分页,那么我们这里肯定讨论的不是一般的情况,一般的情况我们利用limit分页,或者java代码内存分页都可以解决。
如果数据量非常大,如何解决分页呢?比如下面的SQL。
select * from user where type=0 order by id limit 1000000,100
上面的sql需要查询100条数据,但是是从第100W条开始,mysql会需要遍历跳过前面的100W条,然后从100W条开始,获取100条记录返回,101,102,103......很明显,前面的无效数据没有必要遍历查询的。
2.优化
2.1延迟关联
比如测试表里面有3W多数据,量不大,我们看一下效果,常规的分页语句如下面的SQL语句:
SELECT user_id,activity_id,equity_id,gift_no FROM account_assets_0000 order by update_time limit 30000,10
基本查询耗时在0.5s左右,第一次在1s左右,因为后面的查询有缓存。
利用延迟关联,原理是利用覆盖索引加速查询,优化后SQL如下:
SELECT user_id,activity_id,equity_id,gift_no FROM acctount_asset_0000 as a, (select id from acctount_asset_0000 ORDER BY update_time LIMIT 30000,10 ) as b where a.id=b.id order by udpate_time
优化后,查询性能提升,基本稳定在0.06s,如果数据量千万级别,差别更大。看下图效果:
2.2 书签方式
“书签记录”指我们可以用一个临时变量来存储上一次取数记录的位置,然后在获取下一页的时候,可以根据这个值,来获取大于这个值的下一页记录(上一页类似),直接从该值以后开始扫描。例如,假设我们上一次获取到了分页 limit 599990,10 的记录,最大的值的id为 1690344
(这里的值作为了一个书签记录),则我们获取 limit 600000,10 的记录可以这样写:
SELECT SQL_NO_CACHE * FROM `page_test_t` where id>1690344 ORDER BY id LIMIT 10 ;
书签方式适用于id自增的情况,如果不是自增的,不适用。
以上是关于彻底搞明白大数据量下Mysql的分页优化的主要内容,如果未能解决你的问题,请参考以下文章