MySQL 数据库 分页查询
在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询:
首先来看一下LIMIT:
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如:
select * from table WHERE … LIMIT 10; #返回前10行
select * from table WHERE … LIMIT 0,10; #返回前10行
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
select * from table WHERE ... LIMIT 4 offset 9; # 返回从第9行开始的4条记录
所以通过LIMIT和OFFSET或只通过LIMIT可以实现分页功能
假设 numPerPage 表示每页要显示的条数
pageNum表示页码
那么 返回第pageNum页,每页条数为numPerPage 条数据的sql语句写法为
语句1:select * from table limit (pageNum-1)*numPerPage ,numPerPage
语句2:select * from table limit numPerPage offset (pageNum-1)*numPerPage
分页语句:
方式一:
select * from table order by id limit m, n;
该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录。无疑该查询能够实现分页功能,但是如果m的值越大,查询的性能会越低(越后面的页数,查询性能越低),因为MySQL同样需要扫描过m+n条记录。
方式二:
select * from table where id > #max_id# order by id limit n;
该查询每次会返回n条记录,却无需像方式1扫描过m条记录,在大数据量的分页情况下,性能可以明显好于方式1,但该分页查询必须要每次查询时拿到上一次查 询(上一页)的一个最大id(或最小id)。该查询的问题就在于,我们有时没有办法拿到上一次查询(上一页)的最大id(或最小id),比如当前在第3 页,需要查询第5页的数据,该查询方法便爱莫能助了。
方式三:
为了避免能够实现方式2不能实现的查询,就同样需要使用到limit m, n子句,为了性能,就需要将m的值尽力的小,比如当前在第3页,需要查询第5页,每页10条数据,当前第3页的最大id为#max_id#:
select * from table where id > #max_id# order by id limit 20, 10;
其实该查询方式是部分解决了方式2的问题,但如果当前在第2页,需要查询第100页或1000页,性能仍然会较差。
方式四:
select * from table as a inner join (select id from table order by id limit m, n) as b on a.id = b.id order by a.id;
该查询同方式1一样,m的值可能很大,但由于内部的子查询只扫描了字段id,而不是整张表,所以性能要强于方式1查询,并且该查询能够解决方式2和方式3不能解决的问题。
方式五:
select * from table where id > (select id from table order by id limit m, 1) limit n;
该查询方式同方式4,同样通过子查询扫描字段id,效果同方式4。至于性能的话,方式5的性能会略好于方式4,因为方式5不需要在进行表的关联,而是一个简单的比较。
参考:
http://www.cnblogs.com/duhuo/p/4239436.html
http://www.cnblogs.com/0201zcr/p/4709758.html
MySQL 数据库 分页查询的更多相关文章
- Mysql数据库分页查询
为什么使用分页查询: 数据量比较大时,如果全部查询,展示刚给用户,数据量太大,用户难以接受.并且数据量大,查询慢.如果此时将大量的数据读取到java内存中,可能会存储崩溃. 分页查询的方式: 1.全部 ...
- MySQL、SqlServer、Oracle三大主流数据库分页查询
在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法.可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用 ...
- MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)
一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它 ...
- oracle sqlserver mysql数据库分页
1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...
- Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值
1 Statement和PreparedStatement的特点 a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录 b)对于创建和 ...
- JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...
- Mysql中分页查询两个方法比较
mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM ...
- Oracle和MySql的分页查询区别和PL/SQL的基本概念
Oracle和MySql的分页查询区别: Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...
- java 分页对象以及数据库分页查询
import java.util.List; public class Pager<T> { private Integer pageSize; private Integer total ...
随机推荐
- COM中的HRESULT
- java 笔试之在线模拟
网站地址: https://www.nowcoder.com
- HDU 2883 kebab(最大流)
HDU 2883 kebab 题目链接 题意:有一个烧烤机,每次最多能烤 m 块肉.如今有 n 个人来买烤肉,每一个人到达时间为 si.离开时间为 ei,点的烤肉数量为 ci,每一个烤肉所需烘烤时间为 ...
- Linux库的创建和使用
Linux库的概念 库是一种软件组建技术,里面封装了数据和函数,提供给用户程序调用.使用库能够使程序模块化,提高编译速度,实现代码重用,易于升级. Windows系统提供了大量静态链接库(.lib)和 ...
- 设置Treeview背景色的问题1
有没有哪位兄弟在VB中使用sendmessage对TreeView改变背景色?我现在遇到一个问题,如果把linestyle设为1 的时候,展开节点的时候root部位会 有一个下拉的白色块,如果设为1 ...
- c++中的友元函数
1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...
- 1z0-052 q209_3
3: Identify two situations in which you can use Data Recovery Advisor for recovery. (Choose two.) —° ...
- 解决Eclipse里项目名有红叉,但是底下的每一个文件都没有红叉
有这种错误让人很恼火,因为并不知道是哪个文件引起的整个项目错误.所以我们可以打开下边的错误按钮,看看是什么问题. 1.如果是因为java compiler level does not match t ...
- MVC Linq动态排序
在nuget 中searh System.Linq.Dynamic 安装对应的版本, 这样都可以使用了 var orderExpression = string.Format("{0} {1 ...
- 30、java中递归算法
1.已知有一个数列f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的正数,求f(10)的值. 分析:设x=n+2 => f(x)=2*f(n-1)+f(n-2 ...