mysql update order by limit_MySQL中order by 与 limit 同用会查出重复的数据

MySQL中order by 与 limit 同用会查出重复的数据

结论:

如果多行在列中具有相同的值ORDER BY,则服务器可以自由以任何顺序返回这些行,并且根据整体执行计划,这样做的方式可能有所不同。换句话说,这些行的排序顺序相对于无序列是不确定的。

验证:

建表语句:

CREATE TABLE `test_limit` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(45) DEFAULT NULL,

`create_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4

现在想根据创建时间升序查询test_limit表,并且分页查询,每页3条,那很容易写出sql为:

select * from test_limit order by create_time limit 0,3

执行查询(问题复现):

1、查询第1页数据时:

2、查询第6页数据时:

test_limit表共有50条数据,有17页数据,但是实际查询过程中第2页与第6页竟然出现了相同的数据。

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

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

翻译:

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

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

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

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

翻译:

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

解决:

官方给出的解决方案(推荐):

翻译:

方案二(个人版):

加索引

*对于区分度不高的字段并不推荐,例如add_time,但是update_time还凑合

效果验证:

执行计划:

MySQL中order by 与 limit 同用会查出重复的数据 相关文章

docker入门命令以及坑点 Tomcat Redis MySQL

docker笔记 1、基本命令 查看本地镜像: docker images 搜索镜像: docker search centos 搜索镜像并过滤是官方的: docker search --filter "is-official=true" centos 搜索镜像并过滤大于多少颗星星的: docker search --filter stars=10 centos 下载cento

MySQL 5.7 Windows10版本安装记录

MySQL 5.7 Windows10版本安装记录 MySQL 下载 进入MySQL官方 https://dev.mysql.com/downloads/mysql/5.7.html 根据自身Windows版本,选择相应的 .zip 压缩包下载。一般提供 Installer 和 .zip 两种下载方式,一般建议用自己电脑开发时使用 .zip 方式,方便

MySql笔记

初识MySQL 为什么学习数据库 1、岗位技能需求 2、现在的世界,得数据者得天下 3、存储数据的方法 4、程序,网站中,大量数据如何长久保存 5、 数据库是几乎软件体系中最核心的一个存在。 什么是数据库 数据库 ( DataBase , 简称 DB ) 概念 : 长期存放在计算机内

mysql数据库5.7版本部署

1.安装前准备: (mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz 二进制安装包 + centos7.4系统,有yum环境,可以在www.mysql.com官网下载) 2.开始安装 shell yum install libaioshell groupadd mysqlshell useradd -r -g mysql -s /bin/false mysqlshell cd

Seata1.3+nacos+mysql8.x整合配置

1.先确定Seata版本 spring-cloud-alibaba使用2.2.1.RELEASE版 seata使用1.3版本,包括 seata服务端 (就是seata-server)、使用seata的各种微服务端(后面统称 seata客户端 ),都使用1.3版本 2.下载Seata1.3版本的源码和Server版 https://github.com/seata/

一篇文章带你了解CSS 边框(Border)

元素的(Border)边框围绕填充和内容。 一、CSS边框属性 CSS边框属性允许您定义框的边框区域。边框可以是预定义的样式,例如实线,双线,虚线等,[也可以是图像],定义边框的样式(border-style),颜色(border-color)和厚度(border-width)。 1. 边框宽度

k8s mysql主从

CHANGE MASTER TO MASTER_HOST='172.16.68.77',MASTER_PORT=31308,MASTER_USER='slave_db',MASTER_PASSWORD='ujmyhn@Sdn1',MASTER_LOG_FILE='master.000006',MASTER_LOG_POS=224951275;start slave; View Code MYSQL 主从切换 转至元数据结尾 环境: ubuntu

mysql命令行参数

mysql命令行参数 1 Usage: mysql [OPTIONS] [database] //命令方式 2 -, --help //显示帮助信息并退出 3 -I, --help //显示帮助信息并退出 4 --auto-rehash //自动补全功能,就像linux里面,按Tab键出提示差不多,下面有例子 5 6 -A, --no-auto-rehash //默

MYSQL时间查询相关

0.创建表sql语句查询 mysql show create table byzp_personinfo;CREATE TABLE `byzp_personinfo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL, `birthday` date NOT NULL, `create_data` datetime(6), PRIMARY KEY (`id`)) EN

mysql进阶学习三之mycat读写分离和分库分表

前面已经配置了mysql的主从复制,其实很容易,主节点写入了数据,从节点进行同步,所以写操作使用主节点,读操作使用从节点,这样就有效降低了数据库的压力 但是我们用java程序不可能去连接多个数据源,执行sql的时候还要判断是使用主节点还是从节点,所以使

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值