内容简介:作者:业余草来源:https://www.xttblog.com/?p=4631
作者:业余草
来源:https://www.xttblog.com/?p=4631
这个问题相信不少人都遇到过,但很少有人追根溯源。 今天我抽出一点时间,来讨论讨论 order by + limit 在什么情况下会出现分页数据重复。
昨天在“CTO”群提问了之后,不少大神都回答的相当正确。 我这里结合一下他们的回答,并补充一些内容分享给大家!
排序离不开算法,在关系型数据库中,往往会存在多种 排序 算法。 通过 MySQL 的源码和官方文档介绍可以得知,它的排序规律可以总结如下:
-
当 order by 不能使用索引进行排序时,将使用 排序算法 进行排序;
-
若排序内容能全部放入内存,则仅在内存中使用快速排序;
-
若排序内容不能全部放入内存,则分批次将排好序的内容放入文件,然后将多个文件进行归并排序;
-
若排序中包含 limit 语句,则使用堆排序优化排序过程。
其他如: PG,MariaDB,AliSQL,SQL Server 等排序算法方面差别不大。
根据上面的总结,当你的 order by limit 分页出现数据重复。 比如,一个用户表,当使用 limit 5 后出现一个张三。 再使用 limit 5,10 的时候,张三又出现了。 注意,这两个张三是同一个人,id 是相同的。 在这种情况下,你的 order by 肯定是没有使用索引的。 因为使用了索引,就会进行索引排序。
根据官方文档显示,以及我上面的总结,可以得出。 上面的 SQL 使用了堆排序。 因为,category 没索引,所以没走索引排序; 其二我们使用了 limit,所以最终使用了堆排序。 而了解算法的朋友都知道,堆排序是不稳定的。
比如,我们现在有下面一列数。
为了,看清两个 2 的区别,我分别给它们多标了一个数字。
那么使用堆排序的结果,可能会存在下面的结果。
这种不稳定性,指的就是多次排序后,各个数的相对位置发生了变化。
除了堆排序,不稳定的排序还有下面这些排序算法。
那么如何解决 order by limit 分页数据重复问题呢? 方法有多种,我这里列举最常用的两种方法。
第一种就是,在排序中加上唯一值,比如主键 id,这样由于 id 是唯一的,就能确保参与排序的 key 值不相同。
第二种就是避免使用堆排序,让 order by 根据索引来排序。 说白了,就是 order by 后面的字段要有索引。
以上,知道的越多,不知道的就越多,业余的就像一棵小草一样!
想学习更多的 MySQL 底层知识,建议阅读《高性能MySQL》一书。
参考资料:
-
https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html
-
https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
-
https://en.wikipedia.org/wiki/Sorting_algorithm
扫码求关注
给我好看
您看此文用
·
秒,转发只需1秒呦~
好看你就
点点
我
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 我对前后端数据模型和数据流的理解
- 分布式数据一致性理解
- 数据护栏与行为分析(上): 理解任务
- 深入理解 MySQL 索引底层数据结构
- 深入理解 MySQL 索引底层数据结构
- 关于数据库事务并发的理解和处理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python语言程序设计
[美]梁勇(Lang Y. D.) / 李娜 / 机械工业出版社 / 2015-4 / 79.00元
本书采用“问题驱动”、“基础先行”和“实例和实践相结合”的方式,讲述如何使用Python语言进行程序设计。本书首先介绍Python程序设计的基本概念,接着介绍面向对象程序设计方法,最后介绍算法与数据结构方面的内容。为了帮助学生更好地掌握相关知识,本书每章都包括以下模块:学习目标,引言,关键点,检查点,问题,本章总结,测试题,编程题,注意、提示和警告。 本书可以作为高等院校计算机及相关专业Py......一起来看看 《Python语言程序设计》 这本书的介绍吧!