我们做的后端项目一般都会有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分页查询详解的更多相关文章

  1. MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  2. MySQL慢查询详解

    分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”.   查看/设置“慢查询”的时 ...

  3. Mysql学习总结(32)——MySQL分页技术详解

    1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录: 2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大 ...

  4. Mysql高手系列 - 第12篇:子查询详解

    这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...

  5. (转)Mysql 多表查询详解

    MySQL 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  6. 分享知识-快乐自己:Hibernate 中Criteria Query查询详解

    1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...

  7. Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  8. Mysql 三大特性详解

    Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下 ...

  9. ElasticSearch第四步-查询详解

    ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...

随机推荐

  1. EF架构~关于多对多关系表无法更新与插入的问题

    回到目录 在EF里,我们设计模型时,会设计到多对多关系,在EF里会把这种关系会转成两个一对多的关系表,这是比较友好的,因为多对多来说,对于业务本身没什么意思,所以隐藏了,没什么坏处,但对于这个隐藏来说 ...

  2. Android开发学习之路-使用Handler和Message更新UI

    在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一 ...

  3. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案

    Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案 1.1. 七.什么是贝叶斯过滤器?1 1.2. 八.建立历史资料库2 1.3. 十.联合概率的计算3 1.4. 十一. ...

  4. 8 步搭建 Node.js + MongoDB 项目的自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...

  5. KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪

    KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ...

  6. 13.首先,编写一个类ChongZai,该类中有3个重载的方法void print();其次, 再编写一个主类来测试ChongZai类的功能。

    package java1; //计算器 public class Jisuanqi { //属性 //型号,品牌等 //重载 //1.方法同名不同参 //2.返回类型和重载无关 //3.多态的一种表 ...

  7. 信息加密之消息摘要算法的MAC

    MAC是消息摘要算法的第三种实现方式,另外两种方式分别为:MD2\4\5.SHA. MAC的jdk实现:1.默认密钥方式 private static void MAC_JDK(){ try { Ke ...

  8. 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】

    <Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和  ...

  9. Redis持久化方法对比分析

    1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...

  10. fastcgi安装

    fastcgi安装 这里及以下的web服务器都是以nginx为例子和说明,php以5.3为例子. php-fpm fastcgi在服务器上会启动多个进程进行解析,这个时候就需要一个fastcgi的管理 ...