mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据

摘要:
处理方法使用limit批量读取数据,例如selected、pay_timefrom_customer_new,其中flag=0orderbyay_timeasc、idas-climit250,10;查找问题在读取数据的过程中,发现存在具有相同时间戳的记录。分两次阅读时,可能会丢失一条记录。问题分析和猜测当排名值相等时,顺序是不确定的。因此465人失踪,466人出现两次。根据以前的使用经验,MySQL可以做到这一点。然而,这次的问题似乎表明mysql不是这样的。我不知道mysql是相同的还是一个bug。我不太了解mysql的底层实现和数据库原理。我不明白为什么mysql有这个问题。

转自: https://blog.csdn.net/tsxw24/article/details/44994835

我经常使用order by和limit来做数据分页显示并排序,一直也没发现过什么问题。但这两天缺遇到一个严重的问题,在按时间戳升序排列并用limit分批读取数据时,却发现在某些记录丢失了,表中明明有的记录确死活读取不到。研究了大半天终于发现了问题所在,记录一下以防忘记,也是给大家提个醒。

问题重现

工具和原料

数据库:

Ver 14.14 Distrib 5.6.11, for Linux (x86_64) using EditLine wrapper

表结构:

字段类型说明
idint(10)主键
pay_timeint(10)时间戳,有索引
flagtinyint(1)类型标识,用于分类筛选

数据

大概5000条数据, 大部分记录的flag都等于0,pay_time字段时间戳格式都正确

需求

筛选出flag=0的记录,按pay_time升序依次读取所有数据。

处理方式

使用limit分批读取数据,如: 
select id, pay_time from order_customer_new where flag=0 order by pay_time asc, id asc limit 250, 10;

发现问题

在读取数据的过程中,发现有时间戳相等的记录,分两次读取出来时,可能会丢失一条记录。见下图,id=465的记录就丢失了。

图1

这里写图片描述

问题分析与猜测

当排序值相等,其先后顺序的不确定的。这里我猜想:当465和466处于limit末尾时466排在前面,而当处于limit开头时,466缺排到后面去了。所以465丢失了,466出现了两次。 
排序值相等时,其顺序的不确定应该是其结果不可预测。但真正进行排序时应该会采取一定的规则以确定唯一的排序结果,也就是说,即使有相等的排序值,多次排序的结果应该是一样的。从以前的使用经历看,mysql是这么做的。但这次遇到的问题似乎说明mysql并不是这样的。不知道mysql本来就是如此,还是一个bug。

解决办法

既然猜想此问题是因为排序值相等造成顺序不确定引起的,那么就试试增加排序条件让其排序结果是确定的、唯一的。一试果然OK,如下图所示,465出来了。

这里写图片描述

请求支援

我对mysql的底层实现和数据库原理不是很了解,完全不明白mysql为什么会出现这种问题。若哪位朋友能解释一二,不胜感激!

免责声明:文章转载自《mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.说一下你了解的几种设计模式Unix常用命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【MySQL】条件查询之排序聚合分组分页查询

排序查询 语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的。 DESC:降序。 注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。 聚合函数 将一列数据作为一个整体,进行纵向的计算。 count:计算个数 一般选择非...

MySQL之关系映射

数据库的关系一般是用于描述多张表之间的关系。 主要分为: 一对一 一对多 多对多 而不管表与表之间是哪种关系,在创建关联时都需要通过外键(FOREIGN KEY)进行约束,以保证数据的统一性。外键通常都是与另一张表的主键进行关联的。 一、一对一关系一对一关系是指一张表中的一条数据对应另一张表中的唯一一条数据。 例如下面的用户与用户详情表。 用户表: C...

mysql数据库存储过程异常处理

14.1.4  定义条件和处理程序 定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题, 并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。本小节中将详细讲 解如何定义条件和处理程序。 1.定义...

java微信二次第三方开发,token认证,消息事件接收,图文素材库,自定义菜单等功能

基于之前的文章SSM配置的项目:http://www.cnblogs.com/mangyang/p/5168291.html 来进行微信第三方开发, 微信二次开发,官方还是网上有很多介绍了,这里就不在进行讲述了 直接上干货。 首先 与微信对接,服务器配置,需要80端口和443端口开放的服务器,这里推荐 使用 python 的pagekite,一款反向代理...

记一次MySQL数据库拒绝访问的解决过程

问题背景 用wordpress搭博客,数据库采用MySQL。为了调试方便,创建账户my_account ,允许它从任意主机访问数据库。 CREATE USER `my_account`@'%' IDENTIFIED BY 'my_password'; 修改 wp-config.php 相应配置,注意 DB_HOST 设置为 127.0.0.1。 defi...

mysql 行转列

1.表数据 2.结果数据 CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `COURSE` varchar(20) DEFAULT NULL, `SCORE` float...