在MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下:LIMIT子句可以被用于指定 SELECT 语句返回的记录数。

作者:青芽草

 分页查询方法:

在MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下:

LIMIT子句可以被用于指定 SELECT 语句返回的记录数。需注意以下几点:

1、第一个参数指定第一个返回记录行的偏移量

2、第二个参数指定返回记录行的最大数目

3、如果只给定一个参数:它表示返回最大的记录行数目

4、第二个参数为 -1 表示检索从某一个偏移量到记录集的结束所有的记录行

5、初始记录行的偏移量是0(而不是 1)

下面是一个应用实例:

该条语句将会从表 orders_history 中查询第1000条数据之后的10条数据,也就是第1001条到第1010条数据。

数据表中的记录默认使用主键(一般为id)排序,上面的结果相当于:

三次查询时间分别为:

3040 ms

3063 ms

3018 ms

针对这种查询方式,下面测试查询记录量对时间的影响:

三次查询时间如下:

查询1条记录:3072ms 3092ms 3002ms

查询10条记录:3081ms 3077ms 3032ms

查询100条记录:3118ms 3200ms 3128ms

查询1000条记录:3412ms 3468ms 3394ms

查询10000条记录:3749ms 3802ms 3696ms

另外我还做了十来次查询,从查询时间来看,基本可以确定,在查询记录量低于100时,查询时间基本没有差距,随着查询记录量越来越大,所花费的时间也会越来越多。

针对查询偏移量的测试:

三次查询时间如下:

查询100偏移:25ms 24ms 24ms

查询1000偏移:78ms 76ms 77ms

查询10000偏移:3092ms 3212ms 3128ms

查询100000偏移:3878ms 3812ms 3798ms

查询1000000偏移:14608ms 14062ms 14700ms

随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间急剧增加。

这种分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢,而且查询的数据越多,也会拖慢总查询速度。

使用子查询优化

这种方式先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况。

4条语句的查询时间如下:

第1条语句:3674ms

第2条语句:1315ms

第3条语句:1327ms

第4条语句:3710ms

针对上面的查询需要注意:

1、比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍

2、比较第2条语句和第3条语句:速度相差几十毫秒

3、比较第3条语句和第4条语句:得益于 select id 速度增加,第3条语句查询速度增加了3倍

这种方式相较于原始一般的查询方法,将会增快数倍。

使用 id 限定优化

这种方式假设数据表的id是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:

查询时间:15ms 12ms 9ms

这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id的情况,不过一般建立表的时候,都会添加基本的id字段,这为分页查询带来很多便利。

还可以有另外一种写法:

当然还可以使用 in 的方式来进行查询,这种方式经常用在多表关联的时候进行查询,使用其他表查询的id集合,来进行查询:

这种 in 查询的方式要注意:某些 mysql 版本不支持在 in 子句中使用 limit。

关于数据表的id说明

一般情况下,在数据库中建立表的时候,每一张表强制添加 id 递增字段,这样更方便我们查询数据。

如果数据量很大,比如像订单这类,一般会推荐进行分库分表。这个时候 id 就不建议作为唯一标识了,而应该使用分布式的高并发唯一 id 生成器来生成,并在数据表中使用另外的字段来存储这个唯一标识。

首先使用范围查询定位 id (或者索引),然后再使用索引进行定位数据,即先 select id,然后在 select *;这样查询的速度将会提升好几倍。

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期科技领域知识)

歌谣带你看java面试题

第一百三十四期:MySQL分页查询方法及优化相关推荐

  1. MySQL分页查询方法及优化

    MySQL分页查询方法及优化 http://uusama.com/458.html

  2. 第一百三十八期:37 个MySQL数据库小知识,为面试做准备

    无论是运维.开发.测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库.学MySQL,到底是要学习它的哪些东西呢? 作者:芒果教你学编程 无论是运维.开发.测试,还是架构师,数据库技 ...

  3. 第一百三十九期:11月数据库排行:排名前三数据库分数暴跌

    DB-Engines 数据库流行度排行榜 11 月更新已发布,与上期数据相比,这期排行榜最大的亮点就是排名前三数据库那引人注目的"红色"分数. 作者:局长 DB-Engines 数 ...

  4. 第一百三十六期:详细讲解 Redis 的两种安装部署方式

    Redis 是一款比较常用的 NoSQL 数据库,我们通常使用 Redis 来做缓存,这是一篇关于 Redis 安装的文章,所以不会涉及到 Redis 的高级特性和使用场景,Redis 能够兼容绝大部 ...

  5. 第一百三十五期:如何模拟一次阿里双11秒杀场景的实现?程序员必看

    秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影. 作者:IT技术管理那些事儿 秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购 ...

  6. 第一百二十四期:2019年臭名昭著的勒索软件,网络钓鱼和僵尸网络

    Webroot发布了年度恶意软件列表,展示了2019年最臭名昭著的网络安全威胁.从攻击次数最多的勒索软件和加密挖矿,到破坏最大的网络钓鱼攻击,显然,全球网络威胁正在变得更为先进且难以预测. 作者:ki ...

  7. sed 第n行后加入_【高新课堂】第一百三十九期Liunx运维17个实用技巧

    来源:高效运维 1.查找前目录下所有以.tar结尾的文件然后移动到指定目录 find . -name "*.tar" -exec mv {}./backup/ ; 注解:find ...

  8. java mysql 分页查询_MySQL分页查询方法及优化

    当数据库的数据量很大时,一次性查询结果就会变得很慢,为了提高查询效率,我们可以使用MySQL的分页查询功能.本文就为大家带来MySQL分页查询方法及优化. 推荐阅读: 分页查询方法: 在MySQL中, ...

  9. 美学心得(第二百三十四集) 罗国正

    美学心得(第二百三十四集) 罗国正 (2022年2月) 3009.能够将现实给的是一手烂牌,最终打出一手好牌的人,这样的人往往具有几个优秀的特质:第一,有远大的理想,有战略的眼光:第二,能忍常人不能忍 ...

最新文章

  1. linux系统用uefi启动安装win7,uefi下安装win7系统有什么不同
  2. OpenAPI 规范 3.1.0 发布,赶紧来尝尝鲜!
  3. OpenCV Features2D和全息照相法查找已知物体
  4. php中的匿名函数简单使用
  5. win10高分辨率下修改字体显示大小(不是缩放百分比)
  6. init,service和systemctl的区别
  7. 安装LR11,到执行产品配置时,停止不动了
  8. 微软亚洲研究院20周年庆典:纳德拉致敬、沈向洋展望
  9. php如何处理耗时的任务,PHP如何在请求完毕后继续处理耗时任务
  10. Python3.x:pytesseract识别率提高(样本训练)
  11. emacs操作方法总结
  12. php word 简历模板,php程序员简历模板
  13. 蜡笔小新模拟器汉化版_FC蜡笔小新条码版下载-蜡笔小新条码版FC模拟器下载-电玩咖...
  14. 小米游戏本2019 I7-9750H安装黑苹果11.5 big Sur
  15. Matlab 黎卡提方程
  16. Spider和CrawlSpider的源码分析
  17. sqlserver+mysql时间_SqlServer和mysql的日期函数备忘
  18. Spring Boot HTTP over JSON 的错误码异常处理
  19. RRDtool简体中文教程
  20. 根据xml配置地图服务

热门文章

  1. ConcurrentModificationException异常解决办法
  2. 《算法》C++代码 前言
  3. HTTP Live Streaming直播(iOS直播)技术分析与实现(转)
  4. JS 计算日期天数差
  5. 常规dll 的接口函数定义+客户端程序接口函数导入
  6. html隐藏层点击显示不出来,[js+css]点击隐藏层,点击另外层不能隐藏原层
  7. c语言高级语言期中测试答案,上海理工大学C语言2011期中试题和答案
  8. flask + 蓝图 用 sqlalchemy 对 mysql 进行 增删查改 的 demo
  9. java开发过程中,报错Dangling meta character '*' near index 0,解决办法
  10. [react] 说说你是怎么理解react的业务组件和技术组件的?