码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Mysql Order单条记录出现在两页


    Mysql 采用Limit Order by 单条记录出现在两页

    CREATE TABLE `detail` (
      `id` bigint(20) unsigned NOT NULL COMMENT 'ID',
      `batch_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'batch_id',
      PRIMARY KEY (`id`),
      KEY `idx_batch_id` (`batch_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='detail'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    SELECT * FROM detail ORDER BY batch_id asc LIMIT 100 OFFSET 0;
    SELECT * FROM detail ORDER BY batch_id asc LIMIT 100 OFFSET 100;
    
    • 1
    • 2

    同一条记录在上述两种查询中都出现了

    原因

    在有limit的情况下,order by的元素并不能唯一区分一个记录。

    分页重复数据是否出现与排序字段数据唯一性有关,与排序字段是否有序无关,换句话说,只要排序字段的数据能够保证唯一性(如主键、唯一索引、不重复的普通字段),那么分页就不会存在重复数据,否则会有可能出现重复数据在不同分页中。

    修改方案

    SELECT * FROM detail ORDER BY batch_id, id asc LIMIT 100 OFFSET 0;
    
    • 1

    解析

    在MySQL 5.6的版本上,优化器在遇到order by x limit m,n语句的时使用priority queue进行了优化。

    使用优先级队列priority queue的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要少量的内存就可以完成排序,也就是说优先级队列priority queue中只保留需要的最终返回的limit n即可。

    之所以MySQL 5.6出现了第二页数据重复的问题,是因为priority queue使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

  • 相关阅读:
    【力扣题:循环队列】
    Java BigInteger比Long更大的整数自增转字符串存储
    SpringBoot启动项目报错 Consider defining a bean of type ‘xxx‘ in your configuration
    【电动车】电动汽车两阶段优化调度策略(Matlab代码实现)
    vue非常实用的几行代码【日期处理、字符串处理、数组处理、颜色操作】
    图像分割笔记(二): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程))
    MySQL学习笔记(七)——数据处理之增删改
    网络协议-TCP、UDP区别及TCP三次握手、四次挥手
    CVE-2020-0108 安卓前台服务特权提升漏洞
    代码随想录二刷 |链表 | 移除链表元素
  • 原文地址:https://blog.csdn.net/t949500898/article/details/133072214
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号