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数据总量的表中测试,效果非常明显

时间: 2024-10-24 19:16:42

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

MySQL学习笔记(10)之select查询语句

select查询语句 格式: Select 选项 字段列表 from.where like.group by.haring.order by.limit: 字段列表:select * from 表名: Select (字段名) from 表名: 字段部分可参与的运算. Select 字段±数字 from 表名: 1.别名: Select 字段名 as 别名 from 表名: 2.From子句: 查询多个表: select 表1.字段1,表1.字段2...表2.字段1... From 表1,表2:

MySQL主从复制原理及其配置过程

一.MySQL复制原理. 二.MySQL复制配置. 一.MySQL复制原理 1.MySQL复制原理图 复制原理: Slave启动IO Thread和SQL Thread Master启动DumpThread 1.Slave通过IO Thread向Master的Dump Thread发送请求,Master的Dump Thread请求本地的binlog. 2.Master读取本地的binlog,并将读取内容发送给Slave的IO Thread线程. 3.Slave的IO Thread将收到的内容,写

Mysql主从复制原理及配置

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

MySQL索引原理及SQL优化

原文:MySQL索引原理及SQL优化 目录 索引(Index) 索引的原理 b+树 MySQL如何使用索引 如何优化 索引虽好,不可滥用 如何验证索引使用情况? SQL优化 explain查询执行计划 id select_type table type possible_keys key key_len ref rows Extra 优化数据库结构 优化数据大小 优化数据类型 索引(Index) MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.索引的建立对

深度探索MySQL主从复制原理

深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表. 1.2 MySQL 主从复制主要用

MySQL主从复制原理以及架构

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的 数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更 新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服 务器在日志中读取的最后一次成功更新的位置.从服务

MySQL更改root密码、连接MySQL、MySQL常用命令介绍

更改MySQL数据库root密码 1. 首次进入数据库是不用密码的,如下所示: [[email protected] ~]# /usr/local/mysql/bin/mysql -uroot //使用绝对路径进入mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.35 MySQL Community Server (GPL

PHP+MySQL分页原理

1.SQL语句中的limit用法 SELECT * FROM table -- limit   开始位置 , 操作条数  (开始位置从0开始) SELECT * FROM table -- limit   0 , 20   (取前面20条) SELECT * FROM table -- limit   10 , 20   (从11开始取20条) 2.学习分页的一种公式 (1)分页原理 所谓分页显示,也就是讲数据库中的结果集,一段一段显示出来 (2)需要的条件 怎么分段,当前在第几段 (每页有几条

MySQL具体解释(19)----------海量数据分页查询优化

分页的详细解说解说请看http://blog.csdn.net/u011225629/article/details/46775947 查看代码打印1 SELECT * FROM table ORDER BY id LIMIT 1000,10; 以上SQL语句在原理上和在实际操作中是不会存在什么问题,可是当table表的数据量达到几十万以上的时候.上面的语句运行一遍,可能会要运行个十几秒的时间,而且当页数越靠后的话,运行的时间会越长.这个时候我们就须要找到一种更快的查询办法来替代这样的操作了.