MySQL的分页

有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗?网上看到网上推荐了一些分页方法,但似乎不太可行,你能点评一下吗?

  方法1: 直接使用数据库提供的SQL语句

  ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N。

  ---适应场景: 适用于数据量较少的情况(元组百/千级)。

  ---原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3)。Limit限制的是从结果集的M位置处取出N条输出,其余抛弃。

  方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

  ---语句样式: MySQL中,可用如下方法:

  SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M。

  ---适应场景: 适用于数据量多的情况(元组数上万)。

  ---原因: 索引扫描,速度会很快。有朋友提出因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3。

  方法3: 基于索引再排序

  ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M。

  ---适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER  BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)。

  ---原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待)。

  方法4: 基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)

  ---语句样式: MySQL中,可用如下方法:

  PREPARE stmt_name FROM SELECT * FROM 表名称 WHERE id_pk > (?* ?) ORDER BY id_pk

  ASC LIMIT M。

  ---适应场景: 大数据量。

  ---原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。

  方法5:利用MySQL支持ORDER操作可以利用索引快速定位部分元组,避免全表扫描

  ---比如: 读第1000到1019行元组(pk是主键/唯一键)。

  ---SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20。

  方法6: 利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组. 道理同方法5

  ---如(id是主键/唯一键,蓝色字体时变量):

  利用子查询示例:


1

2

3

4

SELECT * FROM your_table WHERE id <=

(SELECT id FROM your_table ORDER

BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc

LIMIT $pagesize

  利用连接示例:


1

2

3

4

5

SELECT * FROM your_table AS t1

JOIN (SELECT id FROM your_table ORDER BY

id desc LIMIT ($page-1)*$pagesize AS t2

WHERE

t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;

  方法7: 存储过程类(最好融合上述方法5/6)

  ---语句样式: 不再给出

  ---适应场景: 大数据量.  作者推荐的方法

  ---原因: 把操作封装在服务器,相对更快一些。

  方法8: 反面方法

  ---网上有人写使用 SQL_CALC_FOUND_ROWS。 没有道理,勿模仿 。

  基本上,可以推广到所有数据库,道理是一样的。但方法5未必能推广到其他数据库,推广的前提是,其他数据库支持ORDER BY操作可以利用索引直接完成排序。

时间: 2024-10-12 13:11:35

MySQL的分页的相关文章

MySQL的分页优化

mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性 实验下 Sql代码   mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> s

atitit。mssql sql server 转换mysql 及 分页sql ast的搭建

atitit.mssql sql server 转换mysql  及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>ast>>mysql 1 3. sql主要的如下::: 1 4. Mssql2MysqlConvertor (proj:wechatAdm4propt 2 1. 主要的的转换::函数的转换,分页的转换 2. 思路::mssql sql >>ast>>mysql 3. sql主要

php分页例子实现读取mysql数据分页显示

以下代码是PHP分页案例,测试通过,主要是PHP+mysql实现分页,代码来处百度空间,有兴趣看的话可以了解一下PHP是如何分页的? <?php $link = mysql_connect("localhost","root", "2855") //连接数据库 or die("连接不上服务器:".mysql_error()); mysql_select_db("aming"); $ittype=$_G

MySQL完美分页

自己学的MySQL完美分页,觉得以后用的着就写篇博客 输出效果图:(没有进行美化) 先在根目录下建立demo.php 和 page.class.php两个文件(demo.php为测试文件,page.class.php为分页类文件) 在数据库中建立自己相应的表,这里以sqldb库和shops表为例 </pre><p><span style="font-size:12px"><img src="http://img.blog.csdn.n

Struts2+Hibernate3+Spring三大框架技术实现MySQL数据分页

原文:Struts2+Hibernate3+Spring三大框架技术实现MySQL数据分页 源代码下载地址:http://www.zuidaima.com/share/1550463494638592.htm 本项目采用了Struts2,Hibernate3,Spring三框架技术来实现对MySQL中的数据进行分页,在本机上面测试通过了,特此分享 java源代码截图:

MySql通用分页存储过程

MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int,out p_recordcount int,out p_pagecount int 5 6$$:begin 7 declare v_sqlcounts varchar(4000); 8

mybatis对mysql进行分页

Mybatis对mysql数据库分页 在generator中增加插件,下载地址http://download.csdn.net/detail/shunlongjin/6937045 <plugintype="org.mybatis.generator.plugins.EqualsHashCodePlugin" /> <plugintype="org.duoku.groom.mybatis.plugin.PaginationPlugin">&l

oracle 的分页与 mySQL&#39;的分页转化

oracle 分页:  关键字ROWNUM SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM ( SELECT A.*, ROWNUM RN FROM (SELECT EMPNO, ENAME, JOB, MGR, TO_CHAR(HIREDATE,'yyyy-MM-dd') HIREDATE, SAL, COMM, DEPTNO FROM EMP ORDER BY EMPNO) A WHERE ROWNUM <= <

mysql limit分页优化

近期一个项目遇到mysql limit分页奇慢无比,查看了数量也就一百万左右,可是查询的一页数据需要两分多钟,sql语句大约是order by limit,网上的优化大概都是在索引,优化子查询这类,都一一试过,速度并没有大的提升. 后来脑洞大开,是不是order by的问题,想想一百万条数据排序应该也是很耗时间的,于是将order by删除了,果然两分半钟竟然缩短到了0.045秒.经过测试如果是单个表的查询,order by 对速度的影响不太明显,当查询和关联和子查询的时候,对速度的影响就显而易