java混合分页_坑,MySQL中 order by 与 limit 混用,分页会出现问题!
在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行后立马返回,而不是排序整个查询结果再返回。如果是通过索引排序,会非常快;
这里我们查看下对应SQL的执行计划:
Paste_Image.png
可以确认是用的文件排序,表确实也没有加额外的索引。所以我们可以确定这个SQL执行时是会找到limit要求的行后立马返回查询结果的。
不过就算它立马返回,为什么分页会不准呢?
官方文档里面做了如下说明:
Paste_Image.png
基于这个我们就基本知道为什么分页会不准了,因为我们排序的字段是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;
再次测试问题解决!!
java混合分页_坑,MySQL中 order by 与 limit 混用,分页会出现问题!相关推荐
- 坑,MySQL中 order by 与 limit 混用,分页会出现问题!
作者:丘八老爷 blog.csdn.net/qiubabin/article/details/70135556 在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排 ...
- MySQL中Order By与Limit不要一起用
切记!MySQL 中 ORDER BY 与 LIMIT 不要一起用,有大坑...... 现象与问题 ORDER BY 排序后,用 LIMIT 取前几条,发现返回的结果集的顺序与预期的不一样. 下面是我 ...
- mysql limit不要1_神坑!MySQL中order by与limit不要一起用!
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 urlify.cn/2u2yEb 推荐:https://www.xttblog. ...
- MySQL中 Order By 和 Limit 的排序问题
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者 | 春卷要炸着吃 来源 | www.cnblogs. ...
- 切记!MySQL中ORDER BY与LIMIT 不要一起用,有大坑
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1. 现象与问题 ORDER BY排序后,用LIMIT取 ...
- bootstrap table无法服务器分页_[精选] MySQL百万数据,你如何用分页来查询数据
文章来自:https://www.cnblogs.com/lxwphp/p/9237331.html 商务合作: 请加微信 2230304070 精选文章正文 在开发过程中我们经常会使用分页,核心技术 ...
- mysql limit不要1_切记!MySQL中ORDER BY与LIMIT 不要一起用,有大坑
程序员的成长之路互联网/程序员/技术/资料共享阅读本文大概需要 2.8 分钟. 来自:占小狼 1. 现象与问题ORDER BY排序后,用LIMIT取前几条,发现返回的结果集的顺序与预期的不一样.下面 ...
- MySQL中order by中关于NULL值的排序问题
MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...
- mysql varchar 效率_由MySQL中char和varchar效率想到的
对比char和varchar随便在google或百度中搜一下得到的结论大概都是"char定长,varchar不定长,char要比varchar占用更多的空间,由于定长char的效率高于var ...
最新文章
- txt文件分解为固定条数的文件
- linux打开u盘里的文件,Linux下U盘内容为只读文件不能存储其他内容的解决办法
- C++ vector容器类型
- 使用 baget 搭建 nuget 私有服务
- bzoj3203: [Sdoi2013]保护出题人
- 兼容ie6css怎么设置,CSS样式兼容IE6、IE7、IE8、FF火狐浏览器的方法
- 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
- 音频频谱特效 jaVa_基于Matlab dsp工具箱 的实时音频采集及频谱显示
- mysql中的leading用法_MySQL 函数笔记
- 未来智能穿戴把计算机织进纤维里,未来智能穿戴 把计算机“织”进纤维里
- 配置javaw.exe双击运行jar包
- Nodejs 获取本机IP地址
- Rds mysql 内存配置_RDS MySQL内存管理
- PC3000可恢复的SSD固态硬盘支持列表
- [耀湾/微亚细亚] 夜降り萃梦乡 FIN.
- 【概率图与随机过程】25 从有向到无向:谈谈条件随机场
- python如何安装keras和tensorflow
- linux之vimdiff命令
- Java使用openssl详解(openssl安装教程、openssl制作证书、java代码实现openssl、浏览器通过https访问后端)入门
- 【3D目标检测】[看code] VoxelRCNN RPN(一)
热门文章
- 怎样用html制作动态心,利用html+css3制作心的跳动动画
- spring boot admin 2.2 获取日志失败_SB实战20-Spring Boot的日志和报告
- 打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...
- win10设置默认输入法_个性化设置技巧
- 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
- UVA - 1589 ​​​​​​​Xiangqi
- VR究竟多奇幻?eSmart邀你共赴一场VR奇幻之旅!
- 上市公司行情查询站点
- 并发数据结构-1.1 并发的数据结构的设计
- 黑马程序员_7k面试题交通管理系统