原文:http://www.jb51.net/article/46015.htm

以前我在mysql中分页都是用的 limit 100000,20这样的方式,我相信你也是吧,但是要提高效率,让分页的代码效率更高一些,更快一些,那我们又该怎么做呢?

第一部分:看一下分页的基本原理:

复制代码代码如下:

mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20
***************** 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)

对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

第二部分:根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:

复制代码代码如下:

SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;//下一页

处理下一页的时候SQL语句可以是:

复制代码代码如下:

SELECT * FROM message WHERE id<1000 ORDER BY id DESC LIMIT 20;//上一页

不管翻多少页,每次查询只扫描20行。

缺点是只能提供上一页、下一页的链接形式,但是我们的产品经理非常喜欢“上一页 1 2 3 4 5 6 7 8 9 下一页”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的clue做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是2519,最小的是2500;

当是第10页的SQL如下:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20

比如要跳到第9页,SQL语句可以这样写:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 0,20

比如要跳到第8页,SQL语句可以这样写:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 20,20

比如要跳到第7页,SQL语句可以这样写:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 40,20

跳转到第11页:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20

跳转到第12页:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20

跳转到第13页:

复制代码代码如下:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。

已在60W数据总量的表中测试,效果非常明显

mysql分页原理和高效率的mysql分页查询语句相关推荐

  1. mysql中如何分页查询_MySQL_mysql分页原理和高效率的mysql分页查询语句,以前我在mysql中分页都是用的 l - phpStudy...

    mysql分页原理和高效率的mysql分页查询语句 以前我在mysql中分页都是用的 limit 100000,20这样的方式,我相信你也是吧,但是要提高效率,让分页的代码效率更高一些,更快一些,那我 ...

  2. mysql分页原理_转:mysql分页原理和高效率的mysql分页查询语句

    (转自:http://www.jb51.net/article/46015.htm) 以前我在mysql中分页都是用的 limit 100000,20这样的方式,我相信你也是吧,但是要提高效率,让分页 ...

  3. Oracle 分页与排序功能的4个查询语句

    查询内置的表emp 1. 查询前10条记录 SELECT * FROM emp WHERE ROWNUM <= 10; Oracle 分页和排序常用的4条查询语句之二,查询第11到第20条记录 ...

  4. php分页技术的作用,分页原理技术细节剖析(php+mysql)实例

    提到分页,大家都不陌生,在我们日常浏览网页时常遇到,尤其新闻文章列表等都有分页,如下图所示: 分页实例 下面,通过一个实例为大家剖析一下分页原理上技术细节. 一.功能开发思路 在分页功能的实现前,先做 ...

  5. php mysql 实现原理_PHP底层和mysql的通信原理

    要清楚的几个概念: FPM进程:进程数在php-fpm.ini中设置.没有设置 max_requests ,那么进程是不会销毁的,也就是说当一个进程里面出现死循环或者内存溢出等导致进程僵死的情况出现的 ...

  6. mysql安装原理_全面解读MySQL主从复制,从原理到安装配置

    为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了 ...

  7. MySQL基础回顾(六):数据查询语言DQL---select查询语句总结(篇一)

    目录 先建一个数据库和若干张表 完整语法 1.基础查询 2.字段别名 3.去重 4.where子句查询 5.模糊查询 6.联表查询 7.分页和排序 8.子查询和嵌套查询 9.分组查询和having语句 ...

  8. MySQL番外篇:一条SQL查询语句是如何执行的?

    在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...

  9. laravel mysql注入_PHP 项目中单独使用 Laravel Eloquent 查询语句来避免 SQL 注入

    OWASP (Open Web Application Security Project) 是一个记录当前 web 应用所受威胁情况的项目.我一直都在关注他们的网站,从 2010,2013 和 201 ...

最新文章

  1. MYSQL修改配置,允许远程访问
  2. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness
  3. 第k大的数python代码_【Python】【输出前m大的数】
  4. 【TJOJI\HEOI2016】求和
  5. Flutter React编程范式实践
  6. LogisticRegression针对中文文本分类
  7. 【IfICan】脚步很乱!
  8. 使用jsp,tag提取字符串中的单词
  9. ssh放行端口_安全组中已经添加规则放行SSH端口的访问之后如何使用f1 RTL
  10. vue中this.$nextTick()的使用---SpringCloud Alibaba_若依微服务框架改造_ElementUI---工作笔记017
  11. CreateaJointCurve.txt
  12. Mac VMWARE 安装redis
  13. [转]将c#中datagridview中的数据导出到excel中
  14. 第二十三章:触发器和行为(九)
  15. Window.iso镜像文件下载
  16. 计算机无法添加打印机,无法添加打印机,教您无法添加打印机怎么办
  17. pygame游戏之旅2:创建游戏窗口界面
  18. 编程十年 (13):毁人不倦1
  19. 有些人的微信字体可以变成蓝色,点进去就可以知道答案,这是为什么呢?
  20. Leetcode 1218. 最长定差子序列(DAY 47) ---- 动态规划学习期(昨天又没有看书捏 懒狗biss)

热门文章

  1. 五个为你的设计添加光影效果的简单技巧(转)
  2. jsonView谷歌插件
  3. [luogu 3773][CTSC 2017]吉夫特
  4. Fault,Error与Failure的联系与区别
  5. oracle函数,oracle编写函数
  6. 设计模式(观察者模式)
  7. 老王学linux-centos6.7drbd8.4.3
  8. putty秘钥验证登录和xshell秘钥验证登录
  9. vuejs学习笔记(1)--属性,事件绑定,ajax
  10. 建立普通用户信任关系,