高效的mysql分页技巧

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效的mysql分页技巧相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

高效的mysql分页技巧,分页功能是一项对技术有着一定要求和理解的项目,因为分页对数据库的I/O压力开销其实在数据量很大的时候,开销还是很大的,所以对于分页功能的高效,将会大大减轻数据库的压力,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。所以说,树倒了,没有一片雪花是无辜的,抽奖都是假的,只有人家想让你中和不想让你中,如果大家觉得文章有帮助,请给博主一波关注和评论。

目录

 一、分页语句

二、效率分析

三、上下分页优化

四、多分页优化

五、优化后效率


 一、分页语句

  • 我们一般分页的sql语句都会用到最基础的limit,如下所示
  • 其中的 m,n 代表从m行开始取后面的n
select * from message order by id desc limit m,n;

二、效率分析

  • 虽然上面的语句在分页中并没有错
  • 大家也知道语句本身并没有错误,但是错就错在这样分页的效率本身是不可取的
  • 但是我们来执行下面的语句来分析一下这个语句的效率究竟是哪里有问题
  • 可以看到如果我从10000行开始取20条数据
  • 这条语句将会扫描10020条数据,相信到这里,大家应该知道我想说的是什么了
  • 对,那就是如果数据很大,每次取20条数据都得扫描远远超过20条的数据,甚至筛选上百万条数据后然后选择20条
  • 这里是不是暴露了很大的效率问题,而我们要做的就是如何优化这个问题
 explain SELECT * FROM message ORDER BY id DESC LIMIT 10000,20\\G
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message type: index possible_keys: NULL key: PRIMARY key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)

 三、上下分页优化

  • 分页大概分为2种,一种是只有上下页两个按钮的分页,另一种是现在大多会使用的分页,就是可以选择第几页进行跳转
  • 而对于只有上下页分页按钮的优化,其实我们要记住每次分页的最大数值或者最小数值
  • 比如我们当前是第十页,当前分页数据最大值为100000,那我们点击下一页,也就是第十一页的时候,可以这样来写分页语句
  • 比如我们当前是第十页,当前分页数据最小值为99980,那我们点击上一页,也就是第九页的时候,可以这样来写分页语句
//下一页
select * from message where id>100000 order by id asc limit 20;
//上一页
select * from message where id<99980 order by id desc limit 20;

四、多分页优化

  • 而现在都是多分页,也就是说用户可以选择页面进行跳转
  • 这样上面仅仅有上下页按钮的分页显然不能满足
  • 有步骤一种的效率分析可以知道,这部分的效率很差,主要是因为m这个值太大,导致扫描的行数过多导致的
  • 那么我们就要想方设法的将m值降低,自然可以优化好分页这个功能
  • 比如我们当前是第十页,条目最大数值为100000,最小为99980,比如跳到第十二页或第八页,可以这样写
//从第十页跳到第十二页
SELECT * FROM message WHERE id > 100000 ORDER BY id ASC LIMIT 20,20;
//从第十页跳到第八页
SELECT * FROM message WHERE id < 99980 ORDER BY id DESC LIMIT 40,20;

五、优化后效率

  • 其实优化的原理都是一样的,就是记录最大最小值,然后算偏移值,使得m值越小越好
  • 因为m值越小,扫描的行数就会越少
  • 而相对原始的limit m,n,由于一直相对第一页进行偏移,效率当然越翻越差了
  • 经实战检测,优化后的效率,在数据集超过60w后,分页效率提升的极其明显

以上是关于高效的mysql分页技巧的主要内容,如果未能解决你的问题,请参考以下文章

mysql分页原理和高效率的mysql分页查询语句

mysql 较为高效的分页

你可能不知道的JavaScript代码片段和技巧(下)

你可能不知道的JavaScript代码片段和技巧(上)

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

MySQL高效分页解决方案集