MySQL 通过 limit 实现分页查询。limit 接收一个或两个整数型参数。如果是两个参数,第一个指定返回记录行的偏移量,第二个指定返回记录行的最大数目。初始记录行的偏移量是 0。为了与 PostgreSQL 兼容,limit 也支持limit a offset b【a:取的记录数;b:索引】。

一、分页查询

客户端通过传递 start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据。MySql 数据库提供的分页函数 limit m,n 用法和实际需求不切合,所以就需要根据实际情况去改写适合分页的语句。

1️⃣查询第1条到第10条的数据select * from table limit 0,10;

--->对应需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

2️⃣查询第11条到第20条的数据select * from table limit 10,10;

--->对应需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

3️⃣查询第21条到第30条的数据select * from table limit 20,10;

--->对应需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

由此,得出符合需求的分页 sql 格式是:select * from table limit (start-1)*pageSize,pageSize;其中 start 是页码,pageSize 是每页显示的条数。

二、性能问题

对于小的偏移量,直接用 limit 查询没有什么问题。随着数据量的增大,越往后分页,limit 语句的偏移量越大,速度也会明显变慢。

优化思想:

避免数据量大时扫描过多的记录

解决:

子查询的分页方式或者 JOIN 分页方式。JOIN 分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。

一般 MySQL 的主键是自增的数字类型,这种情况下可以使用下面的方式进行优化。以真实的生产环境的6万条数据的一张表为例,比较一下优化前后的查询耗时:

-- 传统 limit,文件扫描

select * from table order by id limit 50000,2;

受影响的行: 0

时间: 0.171s

-- 子查询方式,索引扫描

select * from table

where id >= (select id from table order by id limit 50000 , 1)

limit 2;

受影响的行: 0

时间: 0.035s

-- JOIN 分页方式

select * from table as t1

join (select id from table order by id limit 50000, 1) as t2

where t1.id <= t2.id order by t1.id limit 2;

受影响的行: 0

时间: 0.036s

可以看到经过优化性能提高了很多倍。

优化原理:

子查询是在索引上完成的,而普通的查询是在数据文件上完成的。通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。因为要取出所有字段内容,普通查询需要跨越大量数据块并取出,而另一种方式直接根据索引字段定位后,才取出相应内容,效率自然大大提升。因此,对 limit 的优化,是避免直接使用 limit,而是首先获取到 offset 的 id,然后直接使用 limit size 来获取数据。

在实际项目使用,可以利用类似策略模式的方式去处理分页。例如,每页 100 条数据,判断如果是 100 页以内,就使用最基本的分页方式;如果大于 100,则使用子查询的分页方式。

三、limit 优化。使用合理的分页方式以提高分页的效率

使用 limit 实现分页逻辑。不仅提高了性能,同时减少了不必要的数据库和应用间的网络传输。

查询结果只有一条或者只要最大/最小一条记录,建议用 limit 1。这是为了使 explain 中 type 列达到 const 类型。“limit 1”可以避免全表扫面,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大提高。当然,如果查询字段是唯一索引的话,没必要加 limit 1,因为 limit 的存在主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表扫描,有没有 limit ,性能的差别并不大。

使用下面 SQL 语句做分页的时候,随着表数据量的增加,直接使用 limit 分页查询会越来越慢。

select id,name from product limit 89757, 20

优化如下:可以取前一页的最大行数的 id,然后根据这个最大的 id 来限制下一页的起点。此列中,上一页最大的 id 是 89756。SQL 可以采用如下的写法:

//方案一 :返回上次查询的最大记录(偏移量)

select id,name from product where id> 89756 limit 20

//方案二:order by + 索引

select id,name from product order by id limit 10000,10

//方案三:在业务允许的情况下限制页数

理由如下:

当偏移量最大的时候,查询效率就会越低,因为 MySQL 并非是跳过偏移量直接去取后面的数据,而是先把偏移量+要取的条数,然后再把前面偏移量这一段的数据抛弃掉再返回的。

如果使用优化方案一,返回上次最大查询记录(偏移量),这样可以跳过偏移量,效率提升不少。

方案二使用 order by+索引,也是可以提高查询效率的。

方案三的话,建议跟业务讨论,有没有必要查这么多的分页。因为绝大多数用户都不会往后翻太多页。

【强制】 在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。

mysql分页limit运算,MySQL的limit分页查询及性能问题相关推荐

  1. MySQL的limit用法和分页查询的性能分析及优化

    一.limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMI ...

  2. 分页的limit_20.MySQL中的LIMIT(分页)

    对于一次性查询出的大量记录,不仅不便于阅读查看,还会浪费系统效率.MySQL中提供了一个关键字LIMIT,可以限定记录的数量,也可以指定查询从哪一条记录开始(通常用于分页). 1.准备 CREATE ...

  3. mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。

    转载地址:http://www.cnblogs.com/lpfuture/p/5772055.html 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: ...

  4. mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...

    php mysql limit 分页优化,页面越大查询越慢 一.测试前言 当前测试表:nodes_hierarchy目前数据量为20多万 程序分页中我们经常使用的核心sql语句select * fro ...

  5. mysql jsp分页技术_一个非常简单的分页技术MYSQL JSP 利用了mysql的LIMIT参数

    一个非常简单的分页技术MYSQL JSP 利用了mysql的LIMIT参数 优点:1自己想出来的 2利用了MYSQL 数据库的本身 LIMIT 缺点:现在仅仅实现了 下一个页面功能 <% int ...

  6. java mysql limit分页,MySQL limit使用方法以及超大分页问题解决

    前言 日常开发中,我们使用mysql来实现分页功能的时候,总是会用到mysql的limit语法.而怎么使用却很有讲究的,今天来总结一下. limit语法 limit语法支持两个参数,offset和li ...

  7. mysql分页语句解释,mysql语句分页limit什么意思

    mysql语句分页limit什么意思 主要是取数据条数用的 比如取前几条或者中间某几条数据 举两个例子吧 limit 10 (limit 0,10的缩写)这个表示取前十条 limit 2,10 从第三 ...

  8. MySQL 查询 limit 1000,10 和 limit 10 速度一样快吗? 深度分页如何破解

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 刷网站的时候,我们经常会遇到需要分页查询的场景. 比如下图红框里的翻页功能. 我们很容易能联想到可以用mysql实现. 假设我们的建 ...

  9. mysql limit 大数据_MySQL limit使用方法以及超大分页问题解决

    前言 日常开发中,我们使用mysql来实现分页功能的时候,总是会用到mysql的limit语法.而怎么使用却很有讲究的,今天来总结一下. limit语法 limit语法支持两个参数,offset和li ...

最新文章

  1. [ZCCAD-2006.12]CAD练习图例
  2. python爬虫搜特定内容的论文_Python 爬虫爬取指定博客的所有文章
  3. mysql 导入文件夹_MySQL-导入与导出
  4. Realtek网卡如何识别具体型号是8111B/8111C/8111D还是8111E???
  5. 停牌17个月 汉能薄膜真的要复牌了?
  6. HTML5教程:1.3 HTML 5的使用理由和待解决问题
  7. index mysql_mysql 原理~ index的详解
  8. wetool个人版_个人版wetool -公众号
  9. Java多线程系列 JUC线程池01 线程池框架
  10. java 综合练习_Java 之综合练习
  11. 指针变量的所占字节数大小确定
  12. mysql win7 zip_win7 下zip版mysql安装
  13. Android Transition Framework详解---超炫的动画框架
  14. c语言bim的题目,BIM考试选择题精选
  15. EXCEL中行列转换
  16. 西门子plc S7-1200学习历程(1)
  17. 离职员工住房公积金提取办法(深圳)
  18. Python金融应用编程(数据分析、定价与量化投资) !
  19. css3自定义字体实现毛体输出沁园春雪以及font属性
  20. 小猫爪:i.MX RT1050学习笔记4-IO系统

热门文章

  1. 【福利派送】浪漫七夕,不可辜负!这 8 份礼物请收下!
  2. 3DSlicer12:风格准则
  3. 小波的秘密10_小波包的数学支撑
  4. C#中线程池的简单应用
  5. 【CyberSecurityLearning 34】Linux脚本编写(Shell脚本)
  6. 实验九 根据材料编程(改变字体颜色)
  7. 聚簇索引、非聚簇索引、普通索引、唯一索引
  8. STM32开发 -- 蓝牙开发详解(1)
  9. Leetcode- Z 字形变换(6)
  10. dnf安徒恩服务器不稳定,DNF安图恩掉线怎么办 INS安图恩攻坚战不惧掉线