文档章节

MySQL的分页技术总结

zyt_1978
 zyt_1978
发布于 2016/04/09 11:31
字数 845
阅读 120
收藏 14

版权声明:此文章转载自ITeye。 

如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com

方法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

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

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

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

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

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

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

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

利用子查询示例:

SELECT * FROM your_table WHERE id <=
(SELECT id FROM your_table ORDERBY id desc LIMIT ($page-1)*$pagesize ORDER BY id descLIMIT $pagesize

利用连接示例:

SELECT * FROM your_table AS t1JOIN (SELECT id FROM your_table ORDER BYid desc LIMIT ($page-1)*$pagesize AS t2WHEREt1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;

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

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

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

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

方法8: 反面方法

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

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

想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

© 著作权归作者所有

zyt_1978
粉丝 8
博文 166
码字总数 21058
作品 0
程序员
私信 提问
数据分页资料汇总

1.数据库分页Java实现(http://www.cnblogs.com/ITtangtang/archive/2012/04/21/2462385.html) 2.Java分页代码的实现(http://www.open-open.com/lib/view/open1346772322162.html) 3. java分页......

IT追寻者
2016/08/13
41
0
SQL 常用优化手段总结 - 小技巧

中国有句古话叫做:欲速则不达。在一口气学完了分析 SQL 语句的一般步骤与索引的正确运用方式后小憩片刻。搭配上红茶与白兰地轻松享用下面这些小技巧吧! 系列文章回顾 SQL 常用优化手段总结...

给你添麻烦了
2018/01/10
0
0
mysql分页技术分析

转:http://www.scienjus.com/app-server-paging/ APP分页技术 移动端套用传统分页的缺点 目前数据分页一般分为两种类型:传统网站比较常见的电梯式分页布局及移动端比较常见的流式分页布局。...

北极之北
2016/02/25
628
4
实践总结: mysql到oracle的一些开发区别

最近与某行合作, 必须用oracle, 几年没用了, 于是经历了mysql到oracle开发上的一些转换, 简单总结一下: 1, 数据类型 oracle比mysql粗放, 比如mysql的tinyint、bigint、bigdecimal, 在oracle下...

老菜鸟0217
2018/08/21
0
0
MySQL的LIMIT与分页优化

select from table LIMIT 5,10; #返回第6-15行数据 select from table LIMIT 5; #返回前5行 select from table LIMIT 0,5; #返回前5行 性能优化: [sql] view plaincopyprint? 基于MySQL5.0中......

2k10
2015/03/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

4.01、Linux异常

1、无法连接虚拟设备ide1:0,因为主机上没有响应的设备 解决方法:找到“虚拟机” —— 打开“虚拟机设置” —— 单击“CD/DVD(IDE)”,右侧选中“使用ISO映像文件”,然后选中自己的镜像,重启...

静以修身2025
26分钟前
1
0
不允许有匹配 "[xX][mM][lL]" 的处理指令目标

Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标 Caused by: org.xml.sax.SAXParseException; lineNumber: 1; c......

我叫小糖主
29分钟前
1
0
Mysql InnoDB 行锁和表锁介绍

mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表...

嘴角轻扬30
29分钟前
2
0
springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException

报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a......

冥焱
47分钟前
1
0
威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

迷你芊宝宝
54分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部