彻底搞明白大数据量下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的分页优化的主要内容,如果未能解决你的问题,请参考以下文章

大数据量下的分页查询优化技巧

ES大数据量下的查询优化

MySQL的分页优化

PHP+MySQL高效的分页方法,如何优化LIMIT,OFFSET进行的分页?

MySQL百万级数据量分页查询方法及其优化建议

Oracle的极大数据量的分页查询问题