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

以前我在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数据总量的表中测试,效果非常明显相关阅读:

Linux下将UTF8编码批量转换成GB2312编码的方法

Win8.1系统运行阿里旺旺提示异常代码c0000005怎么办?

PHP进行批量任务处理不超时的解决方法

C#编写发送邮件组件

AngularJS基础 ng-href 指令用法

浅析IE10兼容性问题(frameset的cols属性)

window.open()实现post传递参数

php读取大文件示例分享(文件操作类)

C#中Mutex对象用法分析

Knockout text绑定DOM的使用方法

requireJS使用指南

Angular Js文件上传之form-data

Linux rename命令批量重命名的方法

php遍历数组的4种方法总结

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

  1. oracle sql 全是子查询查询速度太慢如何优化_如果面试官问你如何优化mysql分页查询,请把这篇文章甩给他!...

    在我们日常开发中,分页查询是必不可少的,可以说每干后端程序猿大部分时间都是CURD,所以分页的查询也接触的不少,你们都是怎么实现的呢?前不久的一段时间,我的一个同事突然找我寻求帮助,他说他写的sql查 ...

  2. MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询

    第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑 ...

  3. MySQL操作之条件,排序,分页,聚合函数,分组,连接,子查询,自连接查询总结...

    -- 查询练习-- 查询所有字段-- select * from 表名;select * from students;-- 查询指定字段-- select 列1,列2,... from 表名;sele ...

  4. PageHelper分页插件使用 及原理

    1. PageHelper简介 一款很好用的 分页插件,支持多种数据库,拿来即用 2.环境 springboot 2.7.1. jdk11.pagehelper1.4.2 3. PageHelper ...

  5. 分页插件PageHelper工作原理

    数据分页功能是我们软件系统中必备的功能,在持久层使用mybatis的情况下,PageHelper来实现后台分页则是我们常用的一个选择,所以本文专门来介绍下. 1. 原理概述 PageHelper是My ...

  6. 还在用分页?你out了 !试试 MyBatis 流式查询,真心强大!

    欢迎关注方志朋的博客,回复"666"获面试宝典 基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使 ...

  7. 虚拟内存的作用、分页系统实现虚拟内存原理

    文章目录 一.虚拟内存 二.虚拟内存的作用 三.分页系统实现虚拟内存原理 1.虚拟内存技术的实现 2.请求分页管理方式 一.虚拟内存   虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分 ...

  8. mysql 中 RC、RR隔离级别的原理及区别

    今天分享 mysql 中 RC.RR隔离级别的原理及区别: 1.首先简介mysql四种隔离级别: 1)未提交读(READ UNCOMMITED)脏读 2) 已提交读 (READ COMMITED)简称 ...

  9. mysql select内部原理_数据库SQL SELECT查询的工作原理

    作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.以至于从来没有研究过它们的工作原理,在这 ...

最新文章

  1. python控制结构实训_Python 控制结构
  2. 配置文件管理服务器,06-配置文件管理
  3. 2012年11月04日春色满园关不住freeeim源码哇
  4. Linux输入子系统:输入设备编程指南 -- input-programming.txt
  5. rf扫描枪_RF枪_RF手持扫描枪_RF手持机
  6. SNMP原理和MIB库
  7. pygame基本实现塔防游戏
  8. 金仓数据库在 TPCE(dbt5,tpsE)测试框架方面的实践和突破
  9. owncloud创建app
  10. 虚拟实验工场大学计算机报告,模拟工厂实习报告
  11. 解决无线路由器wds桥接频繁掉线的办法
  12. 在Ubuntu 上安装和配置postfix邮箱服务器
  13. C++嵌套类的使用及对外部类的访问权限
  14. 论文研读-用于处理昂贵问题的广义多任务优化GMFEA
  15. 的确,Java存在缺陷。但是……
  16. 涨姿势:在线黑科技小工具,方便快捷
  17. 微联微信管理平台软--- 微信营销平台运营首选的平台软件
  18. springboot属性注入的四种方法
  19. c++怎么打开pptx文件_什么是PPTX文件(以及如何打开一个文件)?
  20. phpstudy网站或站点创建成功,打开无响应

热门文章

  1. Python——图片与视频互转(亲测有效)
  2. Softer-NMS 论文笔记
  3. 论文阅读|训练过程中动态改变训练方案的Dynamic R-CNN
  4. 酒仙网将上市:营销促营收增长,深陷纠纷案,部分股权被法院冻结
  5. 钱颖一:从清华学生身上,我发现了这7个普遍现象……
  6. 数独挑战之九宫格入门第一题解题思路
  7. RSA非对称加密和解密(同时生成密钥)
  8. ps教学之logo设计。
  9. 奋斗正当时|云畅科技2022财年启动会顺利召开
  10. jdk1.7.0_80下载与安装