MySQL排序字段无法唯一标识一条数据,导致分页查询结果出现重复或遗漏问题

news2024/11/16 15:37:45

问题描述

     MySQL排序字段无法唯一标识一条数据,且排序字段可能有多个,多个排序字段无法唯一标识一条数据,即排序字段标识的相同数据过多,可能导致分页查询出现重复或遗漏的情况。

具体说明:
     如果在排序条件中没有包含唯一标识符(如 id),那么MySQL在处理非唯一排序字段的分页查询时,会隐式地使用某种唯一标识来确保排序的一致性和结果的稳定性。

MySQL ORDER BY 排序的实现细节::

     MySQL的排序操作通常使用ORDER BY子句。在排序过程中,如果排序字段存在相同值,MySQL会在后台利用额外的信息来确保排序结果的一致性。这些额外的信息可能包括行的物理位置或行的主键(如果有的话)。

  • ①、表扫描和排序算法:
         MySQL使用不同的扫描和排序算法来实现ORDER BY。当有大量数据需要排序时,MySQL可能会使用基于磁盘的排序算法,这些算法涉及创建临时表或临时文件来保存排序后的数据。
    如果表有主键或唯一索引,MySQL可以使用这些键来辅助排序。在存在相同值的情况下,MySQL会依赖这些键来保持排序的稳定性。

  • ②、隐式唯一标识符:
         当执行ORDER BY price ASC时,如果price字段不是唯一的,MySQL会自动使用每一行的内部行ID(row ID)或主键作为隐式的次要排序键。这确保了即使price相同,不同的行也有确定的排序顺序。
    例如,在InnoDB存储引擎中,每一行都有一个隐式的主键,如果显式主键不存在,则使用行的物理位置(也称为隐藏的行ID)。

  • ③、分页查询的处理:
         在分页查询(LIMIT子句)中,MySQL会首先按指定的排序条件对整个结果集进行排序。然后,它会使用隐式或显式的唯一标识符来确保结果集的稳定性。
    在处理LIMIT子句时,MySQL会从排序后的结果集中提取指定的行,这样即使分页时也不会出现重复或遗漏数据。

实现隐式标识符的具体方式

  • ①、InnoDB引擎:
    InnoDB使用B+树结构存储数据,每个节点都包含行的主键。当没有显式主键时,InnoDB会生成一个隐式主键(6字节长),即隐藏的行ID。
    在ORDER BY操作中,如果排序字段有重复值,InnoDB会使用行的隐式主键来确保排序稳定性。

  • ②、MyISAM引擎:
    MyISAM引擎会使用表的物理行位置作为隐式标识符。在排序相同值时,行的物理位置决定了行的顺序。

问题复现

在排序字段不是唯一的情况下。尽管MySQL会隐式地使用一些内部标识符来确保排序的一致性,但有时仍然会出现问题。

可能的原因

  • 非唯一排序字段:虽然在大多数情况下,MySQL会隐式使用行ID或主键来保持排序结果的稳定性,但在某些情况下,这种机制可能会失效,特别是当数据量较大或涉及复杂的查询时。 比如 使用多个字段进行排序,且多个字段的组合也无法唯一标识一条数据的情况下。
  • 并发数据修改:如果在分页查询期间有其他操作对表数据进行了插入、更新或删除,可能会导致分页结果不一致。
  • 查询缓存:MySQL的查询缓存机制可能会导致分页查询结果的不一致,特别是在数据变化频繁的表中。
-- 某张表  根据 product_hierarchy字段正序排序,再根据material_no字段正序排序  (product_hierarchy和material_no无法唯一标识一条数据)

-- 每页20条   第二页
SELECT * FROM `t_ph_scip_delivery_simulated_head` WHERE user_id = '04f1fd53a4554e3fb5c9a40463a4ea4c'  ORDER BY product_hierarchy ASC ,material_no ASC LIMIT 20,20;
-- 查询结果的第二条数据 的id是   abe180552b0a4d6ab0fa4f9f43550299


-- 每页20条   第三页
SELECT * FROM `t_ph_scip_delivery_simulated_head` WHERE user_id = '04f1fd53a4554e3fb5c9a40463a4ea4c'  ORDER BY product_hierarchy ASC ,material_no ASC LIMIT 40,20;
-- 查询结果的第一条数据 的id是   abe180552b0a4d6ab0fa4f9f43550299

-- 查下这个id abe180552b0a4d6ab0fa4f9f43550299 在整个表中有几条数据  id是唯一标识
SELECT * FROM `t_ph_scip_delivery_simulated_head` WHERE  id = 'abe180552b0a4d6ab0fa4f9f43550299';
-- 结果是只有一条数据

-- 可以得出结论
-- 每页查询20条数据  第二页的第二条数据   和  第三页的第一条数据出现了重复  重复数据的id为 abe180552b0a4d6ab0fa4f9f43550299

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
目前最可能的推测就是在排序时 product_hierarchy 和 material_no 无法唯一标识一条数据,同时InnoDB 引擎在使用隐式主键来确保排序的一致性时也出现了问题(至于具体到底是哪里出了问题暂时还没找到),导致分页出现了重复数据,即排序出现了不稳定的情况。

这种情况危害性比较大,会导致排序结果的混乱,不同页面分页数据的重复,查询和导出的数据顺序不一致,如果前端页面使用重复的id作为DOM元素的key,重复数据量过大时还可能导致前端页面的假死等更严重的情况。

我就是几种比较严重的情况都遇到了… 最终还是前端发现DOM元素key取的id重复了,我得到这个信息之后 才排查出是排序不稳定的问题… 真的太坑了 在此记录一下 希望对遇到相同问题的人能有帮助。

解决方案

为了解决这个问题,应该在 ORDER BY 子句中显示的添加唯一标识符。这样可以确保每一行在任何情况下都有唯一的排序顺序,从而避免分页时的重复或遗漏。

尤其是 使用多个排序字段,并且多个排序字段还无法确定数据唯一性的情况下,建议显式的加上 唯一标识ID作为 次要的最终排序字段。

修改后的SLQ:

-- 显式的加上 唯一标识ID作为 最终的排序字段
SELECT * FROM `t_ph_scip_delivery_simulated_head` WHERE user_id = '04f1fd53a4554e3fb5c9a40463a4ea4c'  ORDER BY product_hierarchy ASC ,material_no ASC ,id ASC  limit xxx,xxx;  

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

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

相关文章

Stable Diffusion AI绘画:从创意词汇到艺术图画的魔法之旅

文章目录 一、Stable Diffusion的工作原理二、从提示词到模型出图的过程三、Stable Diffusion在艺术创作中的应用《Stable Diffusion AI绘画从提示词到模型出图》内容简介作者简介楚天 目录前言/序言本书特色特别提示 获取方式 在科技的飞速发展中,Stable Diffusion…

江协科技STM32学习-1 购买24Mhz采样逻辑分析仪

前言: 本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记,在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用: STM32入门教程-2023版 细致讲…

机器人系统ros2-开发学习实践16-RViz 用户指南

RViz 是 ROS(Robot Operating System)中的一个强大的 3D 可视化工具,用于可视化机器人模型、传感器数据、路径规划等。以下是RViz用户指南,帮助你了解如何使用RViz来进行机器人开发和调试。 启动可视化工具 ros2 run rviz2 rviz2…

【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃,显示为空白页面。 比如下图的错误,导致了左侧页面直接白屏: 由于某一个组件报错导致整个页面崩溃是很严重的问题,那么我们应该如何去降低代码报错带来的影响呢? 我们…

Rockchip芯片 写SN,IMEI,Mac等 写attenstation key 写Remote Key Provisioning

下载AP 写SN等 关机下 按住“音量” 插入USB线 进入loader 方式,在该模式下面写号,设备必须是已经有烧写过固件。 输入sn,点写入,成功。 点读取,成功。 两种设备模式:maskrom 和 loader 模式 maskrom 进…

灶新趋势,跌下神坛的电磁炉,为何被人嫌弃

在厨电市场的广阔天地中,电燃灶与电磁炉作为两种截然不同的烹饪工具,其间的竞争与演变始终牵动着消费者的心弦。近年来,电燃灶以其独特的优势崭露头角,而电磁炉则似乎从昔日的辉煌中跌下神坛,遭到越来越多人的嫌弃。这…

[排序算法]插入排序+希尔排序全梳理!

目录 1.排序是什么?1.1排序的概念1.2排序运用1.3常见的排序算法 2.插入排序分类3.直接插入排序基本思想具体步骤:动图演示代码实现直接插入排序的特性总结: 4. 希尔排序基本思想具体步骤动图演示代码实现希尔排序的特性总结: 5.总…

一种改进的经验小波变换方法(Python环境)

经验小波变换EWT是Gilles基于小波分析理论提出的一种新的自适应信号分解方法,该方法主要分为三个步骤:1.根据傅里叶谱的特性自适应划分频谱,获得一组边界;2.根据边界序列和Meyer小波构造滤波器组;3.滤波重构&#xff0…

Django——Admin站点(Python)

#前言: 该博客为小编Django基础知识操作博客的最后一篇,主要讲解了关于Admin站点的一些基本操作,小编会继续尽力更新一些优质文章,同时欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。 一、简介: Djan…

Midjourney应用:电商模特换装

今天我们应用的是Midjourney应用:电商模特换装 网上找到一件衣服,没有模特 方法一:两图片融合,BLEND命令,效果不是很理想失真 方法二:服装图片垫图说明细节缺失https://cdn.discordapp.com/attachments/1…

map/set和unordered_map/unordered_set的区别及其适用情况

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

我喜欢的vscode插件

有个更全的:提高编程效率的30个VScode插件 Image preview(图片预览) any-rule(正则表达式大全) px to rem & rpx & vw(cssrem)(px和rem之间转换) 小程序开发助手 Auto Close Tag A…

【Vulhub】Fastjson 1.2.24_rce复现

文章目录 一,Fastjson是什么?二,fastjson漏洞原理三,判断是否有fastjson反序列化四,复现Fastjson 1.2.24_rce(vulhub)环境配置1.判断是否存在Fastjson反序列化2.反弹shell3.启动RMI服务器4.构造恶意POST请求 一&#x…

【赠书第26期】AI绘画教程:Midjourney使用方法与技巧从入门到精通

文章目录 前言 1 Midjourney入门指南 1.1 注册与登录 1.2 界面熟悉 1.3 基础操作 2 Midjourney进阶技巧 2.1 描述词优化 2.2 参数调整 2.3 迭代生成 3 Midjourney高级应用 3.1 创意启发 3.2 团队协作 3.3 商业应用 4 总结与展望 5 推荐图书 6 粉丝福利 前言 在…

使用QT可视化操作信号与槽函数详解

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、QT信号与槽机制概述 三、实际操作步骤 四、案例演示 五、总结 一、引言 在…

防火墙技术基础篇:eNSP配置防火墙主备备份的双机热备

防火墙技术基础篇:配置主备备份的双机热备 防火墙双机热备(High Availability, HA)技术是网络安全中的一个关键组成部分,通过它,我们可以确保网络环境的高可靠性和高可用性。下面我们一起来了解防火墙双机热备的基本原…

在CentOS系统上安装Oracle JDK(华为镜像)

在CentOS系统上安装Oracle JDK(华为镜像) 先爱上自己,再遇见爱情,不庸人自扰,不沉溺过去,不为自己的敏感而患得患失,不为别人的过失而任性,这才是终身浪漫的开始。 https://repo.huaweicloud.com/java/jdk …

详解 Spark 核心编程之 RDD 算子

RDD 算子就是 RDD 的方法 一、转换算子 根据数据处理方式的不同可以分为单 Value 类型、双 Value 类型和 Key-Value 类型 1. map /**单 Value 类型算子函数签名:def map[U: ClassTag](f: T > U): RDD[U]功能:将处理的数据逐条进行映射转换&#xff0…

【CGAL】Region_Growing 检测平面并保存

目录 说明一、算法原理二、代码展示三、结果展示 说明 本篇博客主要介绍CGAL库中使用Region_Growing算法检测平面的算法原理、代码以及最后展示结果。其中,代码部分在CGAL官方库中提供了例子。我在其中做了一些修改,使其可以读取PLY类型的点云文件&…

OSPF状态机+SPF算法

OSPF状态机 1.点到点网络类型 down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD 目录后发现不用进行LSA 直接进入ful。若查看后需要进行查询、应答先进入loading,在查询应答完后再进入 fuIl: 2.MA网络类型 down --&g…