作者:丘八老爷

blog.csdn.net/qiubabin/article/details/70135556

在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N。

但是这种写法却隐藏着较深的使用陷阱。在排序字段有数据重复的情况下,会很容易出现排序结果与预期不一致的问题。

比如现在有一张user表,表结构及数据如下:

表结构

表数据

现在想根据创建时间升序查询user表,并且分页查询,每页2条,那很容易写出sql为:select * from user order by create_time limit pageNo,2;

在执行查询过程中会发现:

1、查询第一页数据时:

第一页查询结果

2、查询第四页数据时:

第四页查询结果

user表共有8条数据,有4页数据,但是实际查询过程中第一页与第四页竟然出现了相同的数据。

这是什么情况?难道上面的分页SQL不是先将两个表关联查询出来,然后再排好序,再取对应分页的数据吗???

上面的实际执行结果已经证明现实与想像往往是有差距的,实际SQL执行时并不是按照上述方式执行的。这里其实是Mysql会对Limit做优化,具体优化方式见官方文档:

https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

这个是5.7版本的说明,提取几个问题直接相关的点做下说明。

Paste_Image.png

上面官方文档里面有提到如果你将Limit row_count与order by混用,mysql会找到排序的row_count行后立马返回,而不是排序整个查询结果再返回。如果是通过索引排序,会非常快;

如果是文件排序,所有匹配查询的行(不带Limit的)都会被选中,被选中的大多数或者全部会被排序,直到limit要求的row_count被找到了。如果limit要求的row_count行一旦被找到,Mysql就不会排序结果集中剩余的行了。

这里我们查看下对应SQL的执行计划:

Paste_Image.png

可以确认是用的文件排序,表确实也没有加额外的索引。所以我们可以确定这个SQL执行时是会找到limit要求的行后立马返回查询结果的。

不过就算它立马返回,为什么分页会不准呢?

官方文档里面做了如下说明:

Paste_Image.png

如果order by的字段有多个行都有相同的值,mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。

基于这个我们就基本知道为什么分页会不准了,因为我们排序的字段是create_time,正好又有几个相同的值的行,在实际执行时返回结果对应的行的顺序是不确定的。对应上面的情况,第一页返回的name为8的数据行,可能正好排在前面,而第四页查询时name为8的数据行正好排在后面,所以第四页又出现了。

那这种情况应该怎么解决呢?

官方给出了解决方案:

Paste_Image.png

如果想在Limit存在或不存在的情况下,都保证排序结果相同,可以额外加一个排序条件。例如id字段是唯一的,可以考虑在排序字段中额外加个id排序去确保顺序稳定。

所以上面的情况下可以在SQL再添加个排序字段,比如fund_flow的id字段,这样分页的问题就解决了。修改后的SQL可以像下面这样:

SELECT * FROM `user` ORDER BY create_time,id LIMIT 6,2;

再次测试问题解决!!

END

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

坑,MySQL中 order by 与 limit 混用,分页会出现问题!相关推荐

  1. java混合分页_坑,MySQL中 order by 与 limit 混用,分页会出现问题!

    在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N. ...

  2. MySQL中Order By与Limit不要一起用

    切记!MySQL 中 ORDER BY 与 LIMIT 不要一起用,有大坑...... 现象与问题 ORDER BY 排序后,用 LIMIT 取前几条,发现返回的结果集的顺序与预期的不一样. 下面是我 ...

  3. mysql limit不要1_神坑!MySQL中order by与limit不要一起用!

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 urlify.cn/2u2yEb 推荐:https://www.xttblog. ...

  4. 切记!MySQL中ORDER BY与LIMIT 不要一起用,有大坑

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1.  现象与问题 ORDER BY排序后,用LIMIT取 ...

  5. MySQL中 Order By 和 Limit 的排序问题

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者 | 春卷要炸着吃 来源 | www.cnblogs. ...

  6. mysql limit不要1_切记!MySQL中ORDER BY与LIMIT 不要一起用,有大坑

    程序员的成长之路互联网/程序员/技术/资料共享阅读本文大概需要 2.8 分钟. 来自:占小狼 1.  现象与问题ORDER BY排序后,用LIMIT取前几条,发现返回的结果集的顺序与预期的不一样.下面 ...

  7. MySQL中order by中关于NULL值的排序问题

    MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...

  8. Mysql order by与limit混用陷阱

    在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N. ...

  9. mysql limit括号_采坑笔记——mysql的order by和limit排序问题

    背景说明 今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫 select record.a, ...

最新文章

  1. abb变频器acs800功率_ABB变频器如何选型(1)
  2. 为docker设置国内镜像【转】
  3. Regex Tester (免费有用)
  4. 图的根节点-数据结构作业。。
  5. Autodesk 360 Mobile不能显示图片?
  6. matlab 滤波器设计 coe_一种半带滤波器的低功耗实现方法
  7. linux中php集成软件,最新XAMPP Linux版5.6.3 官方版_免费开源php集成环境下载地址电脑版-锐品软件...
  8. [JSOI2008]最大数maxnumber
  9. mt管理器显示java_真正免root的MT管理器详细使用教程
  10. Python-Django-入门
  11. 集合框架学习笔记(下)
  12. html5 按钮css样式修改,css样式制作的漂亮按钮
  13. 清华计算机系与姚班,清华“姚班”,计算机专业学子们无比向往的班级
  14. iOS信鸽推送:解决通过账号推送不成功的问题
  15. react 返回一个页面_react项目中实现返回不刷新
  16. CUDA C编程(笔记)——CUDA的异构并行计算
  17. 洛谷 [P1638 逛画展] (尺取法)
  18. 问题:电脑桌面黑频,不显示图标
  19. 中国医科大学本科毕业论文答辩PPT模板
  20. String类型的方法

热门文章

  1. 干得漂亮!法院在微信朋友圈精准投放“老赖”广告 网友:建议全国推广
  2. LG卖楼进行时:价值87.7亿元的双子座大厦将出手
  3. 为真全面屏探路?2019款新iPhone将采用超小前置摄像头
  4. 新iPhone将采用更大容量电池:最低3110mAh?
  5. 中消协:要选择优质电子显示产品 OLED屏整体上略胜一筹
  6. 曾逼马云道歉,扬言5年超过阿里!3年后市值差了3万亿 !
  7. 【点阵液晶编程连载二】LCD 驱动的基本流程
  8. 女的喜欢OBC男的喜欢OGC的含义(转)
  9. 功能测试人员技能提升路线图,试从第一个脚步到年薪50W...
  10. WPF如何给窗口设置透明png的图片背景