mysql分页查询详解
我们做的后端项目一般都会有admin管理端,当管理端将要展示数据的时候,就需要用到分页。所以分页的考查在面试中也相当多。在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用order by来排序。但是在表数据量比较大的时候,例如查询语句片段limit 10000,20,数据库会读取10020条数据,然后把前10000条丢弃,把最后的20条返回给你,这种消耗是可以避免的,也是没必要的。下边介绍几种优化方法:
1. 让分页操作在索引中进行
一般表中经常作为条件查询的列都会建立索引,例如如下查询
SELECT
msg_id,
msg_content
FROM message
ORDER BY
gmt_create desc
LIMIT 100, 20;
可以写成如下方式
SELECT
msg_id,
msg_content
FROM message
INNER JOIN (
SELECT
msg_id
FROM message
ORDER BY gmt_create
LIMIT 100, 20
) AS page USING(msg_id);
这样当前查询页的内容就只会在索引中进行,当得到当前页的msg_id再统一通过一个INNER JOIN得到最终要得到的数据详情,避免了对大量数据详情进行操作的消耗。当然JOIN操作也可以通过子查询实现,不过书中介绍5.6之前版本的mysql相比子查询还是优先使用JOIN。
2. 显式指定要查询的索引列范围
如方法一中的gmt_create是建立索引的列,而且你也知道要查询的时间范围,这样你就可以通过如下查询语句:这样数据库通过一个范围查询就可以得到想要的数据。
SELECT
msg_id,
msg_content
FROM message
WHERE gmt_create BETWEEN #startTime# AND #endTime#
ORDER BY gmt_create desc
3. OFFSET作为查询条件显式指定
我们可以在查询参数中显式指定一个查询时间,叫做lastVisitTime吧。我们查询第一页可以用如下语句:
SELECT
msg_id,
msg_content
FROM message
ORDER BY gmt_create desc
LIMIT 20
我们把读出来的数据的最后一条数据的gmt_create字段记录在lastVisitTime字段中,那么后边页的查询就可以用如下语句实现:这种查询方式,无论你查询多少页,分页都不会是影响效率的因素。
SELECT
msg_id,
msg_content
FROM message
WHERE gmt_create < #lastVisitTime#
ORDER BY gmt_create desc
LIMIT 20;
4. limit在MySQL中的用法
limit是mysql的语法,select * from table limit m,n。其中m是指记录开始的index,从0开始,表示第一条记录,n是指从第m+1条开始,取n条。select * from tablename limit 2,4。即取出第3条至第6条,4条记录。
注意m表示的是从第几条数据开始读取,并不是记录的主键id号。(you know it)
5. limit与offset用法比较
SELECT
keyword
FROM
keyword_rank
WHERE
advertiserid='59'
order by
keyword
LIMIT 2 OFFSET 1;
该用法,limit后面跟的是2条数据,offset后面是从第1条开始读取 ****************************************************************************************************
SELECT
keyword
FROM
keyword_rank
WHERE
advertiserid='59'
ORDER BY
keyword
LIMIT 2 ,1;
该用法,limit后面是从第2条开始读,读取1条信息。 注意:Mysql中计数也是从0开始读数的。
6. 优化Limit的用法
当一个查询语句偏移量offset很大的时候,如select * from table limit 10000,10 , 最好不要直接使用limit,而是先获取到offset的id后,再直接使用limit size来获取数据。效果会好很多。
SELECT
*
FROM
customers
WHERE
customer_id >= (
SELECT
customer_id
FROM
customers
ORDER BY
customer_id
LIMIT 10000,
1
)
LIMIT 10;
相关联的一些查询用法实例总结如下:
select * from table limit 5; --返回前5行 select * from table limit 0,5; --同上,返回前5行 select * from table limit 5,10; --返回6-15行 附:(sql server支持,而mysql不支持的一些用法)
1. select top 2 * from table; 选取表中前2条记录
2. select top 50 persent from table; 选取表中50%的记录
7. oracle是如何分页的?
在oracle中采用ROWNUM实现分页查询:
1. 选取前5条记录
SELECT
*
FROM
Persons
WHERE
ROWNUM <= 5; 2. 从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下
SELECT
*
FROM
(
SELECT
ROWNUM R,
t1.*
FROM
Sys_option
WHERE
rownum < 30
) t2
WHERE
t2.R >= 10
mysql分页查询详解的更多相关文章
- MySQL简单查询详解-单表查询
MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...
- MySQL慢查询详解
分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”. 查看/设置“慢查询”的时 ...
- Mysql学习总结(32)——MySQL分页技术详解
1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录: 2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大 ...
- Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- 分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
- Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- Mysql 三大特性详解
Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下 ...
- ElasticSearch第四步-查询详解
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
随机推荐
- EF架构~AutoMapper对象映射工具简化了实体赋值的过程
回到目录 AutoMapper是一个.NET的对象映射工具,一般地,我们进行面向服务的开发时,都会涉及到DTO的概念,即数据传输对象,而为了减少系统的负载,一般我们不会把整个表的字段作为传输的数据,而 ...
- [Java类加载器]Java中classLoader浅析.
本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.l ...
- Atitit 记录方法调用参数上下文arguments
Atitit 记录方法调用参数上下文arguments 1.1. java java8 新的对象Parameter LocalVariableTable 本地变量表 MethodParamete ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- python 数据的拷贝
# -*- config=utf-8 -*- #数据的拷贝 a=[1,2,3,4,5,6,"a","C"]; b=a;# a 与 b 的地址空间相同 a.app ...
- js const
js const const 声明创建一个只读的常量.这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次. const state = { notes: [], activeNote: {} ...
- 深入理解PHP内核(三)概览-SAPI概述
本文链接:http://www.orlion.ml/234/ 1.在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现.这些内置实现的物理位置在PHP源码的SAPI目录.这个目录存 ...
- Android属性动画之ObjectAnimator
相信对于Android初学者,对于Android中的动画效果一定很感兴趣,今天为大家总结一下刚刚学到的属性动画案例. 首先和一般的Android应用一样,我们先建一个工程,为了方便,我们的布局文件中就 ...
- 基于Metronic的Bootstrap开发框架经验总结(7)--数据的导入、导出及附件的查看处理
在很多系统模块里面,我们可能都需要进行一定的数据交换处理,也就是数据的导入或者导出操作,这样的批量处理能给系统用户更好的操作体验,也提高了用户录入数据的效率.我在较早时期的EasyUI的Web框架上, ...
- Visual Studio 2010安装教程
VS2010是一个集C++,VB,C#,等编程环境于一身的集成开发环境,功能强大,能有效提高编程效率.针对 Visual Studio 2010 完全重新设计了帮助查看器.您可以使用首选的 Web 浏 ...