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

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

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gif表结构

68bfdf3476ef0c6acd06a67b23f67ce1.gif表数据

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

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

1、查询第一页数据时:

68bfdf3476ef0c6acd06a67b23f67ce1.gif第一页查询结果

2、查询第四页数据时:

68bfdf3476ef0c6acd06a67b23f67ce1.gif第四页查询结果

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

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

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

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gifPaste_Image.png

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gifPaste_Image.png

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

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

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

68bfdf3476ef0c6acd06a67b23f67ce1.gifPaste_Image.png

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

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

官方给出了解决方案:

68bfdf3476ef0c6acd06a67b23f67ce1.gifPaste_Image.png

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

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

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

再次测试问题解决!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 单机版

简介: Git 是一款开源的分布式版本控制系统,是当今最流行、先进的版本控制软件,没有之一。 Git 是一个分布式的版本控制系统,相反 SVN 就是一个集中式的版本控制系统了。SVN 每修改完一个文件要提交到服务端进行保存,而…

java中的Attribute类_java培训技术ModelAttribute注解修饰POJO类型的入参

RequestMapping(“/testModelAttribute”)//public String testModelAttribute(User user){public String testModelAttribute(ModelAttribute(“abc”) User user){System.out.println(“修改 user”user);return “success”;}/*** ModelAttribute 注解也可以来修饰目标方法 …

php a链接怎么传id_PHP函数参数的传递

PHP 支持两种参数传递方式,分别是按值传递(默认)和按引用传递。另外,PHP 还支持默认参数和可变长度参数列表。参数传递方式在调用函数时需要向函数传递参数,被传入的参数称作实参,而函数定义的参数为形参。PHP 中函数参数传递有 2…

VMware converte报错记录

物理机:centos7.2虚拟化:esxi6.0在进行P2V的时候,尝试了最新的VMware converte6.1及5.5均失败告终。最后在VMware converte6.0中解决迁移问题。转载于:https://blog.51cto.com/bigpi/1758352

php时区问题,PHP中遇到的时区问题解决方法

最近在学习PHP过程中发现PHP中的格式化时间戳比北京时间晚了8个小时,上网搜索发现原来是时区不对,解决办法是:1、永久修改更改php.ini文件中的data.timezone PRC 这是中国时间。重启Apache服务后生效。2、临时修改在使用格式化输入时间之前…

OSG开发概览

1 OSG基础知识 OSG是Open Scene Graphic 的缩写,OSG于1997年诞生于以为滑翔机爱好者之手,Don burns 为了对滑翔机的飞行进行模拟,对openGL的库进行了封装,osg的雏形就这样诞生了,1998年Don burns 遇到了同样喜欢滑翔…

hbuilder php xdebug,Hbuilder使用xdebug配置php断点调试

2019独角兽企业重金招聘Python工程师标准>>>##1. 背景不得不说Hbuilder是免费的前端开发工具中比较好用的,而且配合aptana开发php也马马虎虎(毕竟写前端的时候多些)。本人原是搞java的,后来打算用php做些个人项目(因为服务器成本低)&#xff0c…

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的,>main>set_private>iw_get_priv_info获取wireless网卡所能处理的所有wlan_private_args类型.dev_ioctl>wext_…

PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)

确 定var csrfToken Yii::$app->request->csrfToken?>;var reg /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;var regNum /^\d{6}$/;function check_form() {n false;//全局变量,以便下面做判断var dirversNum $(#dirversNum).val();var archivesNu…

用鼠标去控制物体移动的方法

using UnityEngine; using System.Collections;public class hero : MonoBehaviour {private bool isMouseDown false;private Vector3 lastMousePositionVector3.zero;void Update () {PlayerControler();}public void PlayerControler(){//将像素位置转换成世界坐标轴的位置…

php获取flash上传视频文件大小,如何获取flash文件(.swf文件)的长度和宽度

Flash文件一般是可以缩放的,但缩放显示会一影响flash的效果,比如动作变慢或变快。要想以最佳状态显示,就需要获取flash文件的长度和宽度,因此要使用方法:引入该文件Require(‘swfheader.class.php’);创建一个类的实例…

mx播放器有没有投屏功能_无线投屏、即插即用,投影仪其实可以更智能:明基 E580T...

无论是简单的办公室会议还是小型的线下活动,投影仪都是必不可少的利器:既能有不错的显示效果,也不用受屏幕尺寸的约束。尽管越来越多的智能电视可供电脑连接,但真正派上用场的时候,拎箱就走的投影仪显然是最佳选择。很…

特殊矩阵-对角矩阵

2019独角兽企业重金招聘Python工程师标准>>> 挖坑。 转载于:https://my.oschina.net/aslanjia/blog/651503

php常见漏洞修复,phpstudy漏洞修复方法

一.通过修改服务器环境内php.ini文件,将“expose_php On”修改成“expose_php Off”然后重启php即可。二.若无需要可以将一些php的危险函数禁用,打开/etc/php.ini文件,查找到 disable_functions,添加需禁用的以下函数名&#xf…

vs运行时候冒了这个错:无法启动IIS Express Web 服务器~Win10

后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 网上的方法多种,有让安装扩展插件的,有让在程序里面添加Http系列的组件,有其它其它的,可是。。。…

matlab脚本 定时停止_一触即发是什么软件?它是手机上极其强大的一款脚本辅助精灵...

一触即发app是手机上极其强大的一款免root的脚本辅助软件,堪称一键秒杀脚本精灵,除自动化、运行、管理外,还提供了脚本制作文字教程/视频教程,学习社区和图色处理、定时执行、王者荣耀、变量等命令参数和多点找色、多点找图、京东…

php无限极,php实现无限极分类 - MyClassPHP-Colin主页 - OSCHINA - 中文开源技术交流社区...

/*** 无限分类* param [type] $model 一个模型对象* param integer $pid 上级ID* param array &$categorys 一个保存结果的数组* param integer $spac 空格循环次数* return [type] array*/function data2array($model null , $pid 0 , &$categorys array() , $spac…

Graph(2014辽宁ACM省赛)

问题 F: Graph 时间限制: 1 Sec 内存限制: 128 MB提交: 30 解决: 5[提交][状态][论坛]题目描写叙述 Your task is to judge whether a regular polygon can be drawn only by straightedge and compass. The length of the straightedge is infinite. The width of the compa…

笔记本电脑处理器_高通提示低成本5G芯片更强大的笔记本电脑处理器

高通公司总裁克里斯蒂亚诺阿蒙(Cristiano Amon)在今天的柏林IFA贸易展览会的虚拟主题演讲中说,我们将很快看到更便宜的5G手机,以及更多具有更好应用兼容性的Windows-on-Snapdragon笔记本电脑。欧洲主要的电子产品展览会IFA今年被分成​​几个小组活动&am…

php分布式的锁,laravel分布式并发锁

环境要求1.PHP > 72.composer3.redis(必须支持lua)4.prediscomposer 安装redis 安装predis 安装composer require predis/predislock 安装第一步, 安装alravel-lockcomposer require nabao/laravel-lock第二步, 生成配置文件php artisan vendor:publish --provider"Loc…