mysql中如何分页查询_MySQL_mysql分页原理和高效率的mysql分页查询语句,以前我在mysql中分页都是用的 l - phpStudy...
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...相关推荐
- oracle sql 全是子查询查询速度太慢如何优化_如果面试官问你如何优化mysql分页查询,请把这篇文章甩给他!...
在我们日常开发中,分页查询是必不可少的,可以说每干后端程序猿大部分时间都是CURD,所以分页的查询也接触的不少,你们都是怎么实现的呢?前不久的一段时间,我的一个同事突然找我寻求帮助,他说他写的sql查 ...
- MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询
第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑 ...
- MySQL操作之条件,排序,分页,聚合函数,分组,连接,子查询,自连接查询总结...
-- 查询练习-- 查询所有字段-- select * from 表名;select * from students;-- 查询指定字段-- select 列1,列2,... from 表名;sele ...
- PageHelper分页插件使用 及原理
1. PageHelper简介 一款很好用的 分页插件,支持多种数据库,拿来即用 2.环境 springboot 2.7.1. jdk11.pagehelper1.4.2 3. PageHelper ...
- 分页插件PageHelper工作原理
数据分页功能是我们软件系统中必备的功能,在持久层使用mybatis的情况下,PageHelper来实现后台分页则是我们常用的一个选择,所以本文专门来介绍下. 1. 原理概述 PageHelper是My ...
- 还在用分页?你out了 !试试 MyBatis 流式查询,真心强大!
欢迎关注方志朋的博客,回复"666"获面试宝典 基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使 ...
- 虚拟内存的作用、分页系统实现虚拟内存原理
文章目录 一.虚拟内存 二.虚拟内存的作用 三.分页系统实现虚拟内存原理 1.虚拟内存技术的实现 2.请求分页管理方式 一.虚拟内存 虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分 ...
- mysql 中 RC、RR隔离级别的原理及区别
今天分享 mysql 中 RC.RR隔离级别的原理及区别: 1.首先简介mysql四种隔离级别: 1)未提交读(READ UNCOMMITED)脏读 2) 已提交读 (READ COMMITED)简称 ...
- mysql select内部原理_数据库SQL SELECT查询的工作原理
作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.以至于从来没有研究过它们的工作原理,在这 ...
最新文章
- python控制结构实训_Python 控制结构
- 配置文件管理服务器,06-配置文件管理
- 2012年11月04日春色满园关不住freeeim源码哇
- Linux输入子系统:输入设备编程指南 -- input-programming.txt
- rf扫描枪_RF枪_RF手持扫描枪_RF手持机
- SNMP原理和MIB库
- pygame基本实现塔防游戏
- 金仓数据库在 TPCE(dbt5,tpsE)测试框架方面的实践和突破
- owncloud创建app
- 虚拟实验工场大学计算机报告,模拟工厂实习报告
- 解决无线路由器wds桥接频繁掉线的办法
- 在Ubuntu 上安装和配置postfix邮箱服务器
- C++嵌套类的使用及对外部类的访问权限
- 论文研读-用于处理昂贵问题的广义多任务优化GMFEA
- 的确,Java存在缺陷。但是……
- 涨姿势:在线黑科技小工具,方便快捷
- 微联微信管理平台软--- 微信营销平台运营首选的平台软件
- springboot属性注入的四种方法
- c++怎么打开pptx文件_什么是PPTX文件(以及如何打开一个文件)?
- phpstudy网站或站点创建成功,打开无响应