8种MySQL分页方法总结
这篇文章主要介绍了8种MySQL分页方法总结,小编现在才知道,MySQL分页竟然有8种实现方法,本文就一一讲解了这些方法,需要的朋友可以参考下
MySQL的分页似乎一直是个问题,有什么优化方法吗?网上看到网上推荐了一些分页方法,但似乎不太可行,你能点评一下吗?
方法1: 直接使用数据库提供的SQL语句
---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N。
---适应场景: 适用于数据量较少的情况(元组百/千级)。
---原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3)。Limit限制的是从结果集的M位置处取出N条输出,其余抛弃。
方法2: 建立主键或唯一索引, 利用索引(假设每页10条)
---语句样式: MySQL中,可用如下方法:
---适应场景: 适用于数据量多的情况(元组数上万)。
---原因: 索引扫描,速度会很快。有朋友提出因为数据查询出来并不是按照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中,可用如下方法:
ASC LIMIT M。
---适应场景: 大数据量。
---原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。
方法5:利用MySQL支持ORDER操作可以利用索引快速定位部分元组,避免全表扫描
---比如: 读第1000到1019行元组(pk是主键/唯一键)。
方法6: 利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组. 道理同方法5
---如(id是主键/唯一键,蓝色字体时变量):
利用子查询示例:
(SELECTid FROMyour_table ORDER
BYid descLIMIT ($page-1)*$pagesize ORDERBYid desc
LIMIT $pagesize
利用连接示例:
JOIN(SELECTid FROMyour_table ORDERBY
id descLIMIT ($page-1)*$pagesize ASt2
WHERE
t1.id <= t2.id ORDERBYt1.id descLIMIT $pagesize;
方法7: 存储过程类(最好融合上述方法5/6)
---语句样式: 不再给出
---适应场景: 大数据量. 作者推荐的方法
---原因: 把操作封装在服务器,相对更快一些。
方法8: 反面方法
---网上有人写使用 SQL_CALC_FOUND_ROWS。 没有道理,勿模仿 。
基本上,可以推广到所有数据库,道理是一样的。但方法5未必能推广到其他数据库,推广的前提是,其他数据库支持ORDER BY操作可以利用索引直接完成排序。
来源:https://www.jb51.net/article/60208.htm
8种MySQL分页方法总结的更多相关文章
- Oracle、SQL Server、MySQL分页方法
测试用例:查询TEST_TABLE表中TEST_COLUMN列的第10-20条数据 1,Oracle分页方法 SELECT A.* FROM ( SELECT ROWNUM ROWNO, B.* FR ...
- 4种MySQL分页查询优化的方法,你知道几个?
前言 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的 ...
- 创建用户的方法 3种mysql创建方法
mysql创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户 ...
- 【转载并整理】mysql分页方法
http://blog.csdn.net/bestcleaner/article/details/52993468
- phalcon几种分页方法
phalcon几种分页方法 一: use Phalcon\Paginator\Adapter\Model as PaginatorModel; // Current page to show // I ...
- 数据分页 THINKPHP3.2 分页 三种分页方法
数据分页 复制本页链接 opensns 通常在数据查询后都会对数据集进行分页操作,ThinkPHP也提供了分页类来对数据分页提供支持. 下面是数据分页的两种示例. 第一种:利用Page类和limit方 ...
- sql server两种分页方法
方法一: --分页方法一 OrderID,CustomerID, EmployeeID,OrderDate,ShippedDate,ShipName,ShipAddress,Freight from ...
- PostgreSQL两种分页方法查询时间比较
数据库中存了3000W条数据,两种分页查询测试时间 第一种 SELECT * FROM test_table WHERE i_id> limit 100; Time: 0.016s 第二种 SE ...
- mysql分页优化方法
mysql分页优化方法 今天遇到开发反应分页语句很慢,马上看一下到底是啥的分页语句 原分页语句 SELECT * FROM `tt` LIMIT , 执行这个语句需要6秒+时间 执行计划为全表扫描 在 ...
随机推荐
- hacknos-player靶机渗透
靶机下载地址https://www.vulnhub.com/entry/hacknos-player,459/ 网络配置 该靶机可能会存在无法自动分配IP的情况,所以无法扫描到的情况下需要手动配置获取 ...
- go 名词备注
1.Protobuf Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域.
- Linux 文件管理篇(二 目录信息)
其它在线帮助文档 usr/share/doc root用户的相关信息 etc/passwd 用户密码 etc/shadow 所有用户群组 etc/group 返 ...
- STC15W串口通信的一些梳理
由于控制串口1进行通信移植到串口3出现了阻力,因此很有必要对串口通信进行更进一步的梳理>>>> 一 STC15W串口对应引脚: 由此我们得到四个串口引脚分别为:串口1:P3 . ...
- web中拖拽排序与java后台交互实现
一.业务需求 1,在后台的管理界面通过排序功能直接进入排序界面 2,在排序界面能够人工的手动拖动需要排序的标题,完成对应的排序之后提交 3,在app或者是前端就有对应的排序实现了 二.页面展示 将整体 ...
- css文本阴影
文本阴影-text-shadow text-shadow 属性向文本添加一个或多个阴影.该属性是逗号分隔的阴影列表,每个阴影有两个或三个长度值和一个可选的颜色值进行规定,省略的长度是 0. h-sha ...
- paddlehub Test on win10
conda 构建虚拟环境 1)虚拟环境下安装paddlepaddle 1.7 2)pip install paddlehub 3)添加环境变量hub_home,以免模型把c盘撑爆 4)下载的模型在.p ...
- C++学习--编译优化
常量折叠 把常量表达式的值求出来作为常量嵌在最终生成的代码中. 疑问:对于一个很复杂的常量表达式,编译器会算出结果再编译吗?亦或者是把这个表达式完全翻译成机器码,最终留给程序去解决? 分情况: 涉及的 ...
- winfrom 基础
1 winfrom就是一种窗体开发端应用程序 2 窗体分类 1)记事本类:可以最大最小化,可以拖拽 窗体默 ...
- 多线程高并发编程(6) -- Semaphere、Exchanger源码分析
一.Semaphere 1.概念 一个计数信号量.在概念上,信号量维持一组许可证.如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它.每个release()添加许可证,潜在地释 ...