暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql分页查询的重复数据

测试备忘录 2021-06-18
481

今天遇到了mysql分页查询,来记录一下。

mysql对limit的解释:

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

    在order by的值相同时,返回的顺序不一定一致。

    原因是在MySQL 5.6版本,优化器在遇到order by xxx limit x,x 时,会做一个优化,使用优先队列,来进行排序,这样的好处在于在排序过程中,仅保留需要的n条数据即可。但是优先队列使用的是堆排序,是不稳定排序,所以导致了这个问题。


解决方法:

  1. order by后加一个唯一字段(id)进行排序

  2. 给order by字段加上索引


排序的稳定性:

    假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

  • 几个常用排序算法的稳定性

  1. 冒泡排序:稳定

  2. 选择排序:不稳定,每次选择最小的与之前交换,可能会将相同元素的顺序打乱

  3. 插入排序:稳定

  4. 快速排序:不稳定,不稳定发生在key与相遇点进行交换时。

  5. 归并排序:稳定

  6. 基数排序:稳定

  7. 希尔排序:不稳定,插入顺序不同,相同元素可能在不同的插入顺序中分别排序

  8. 堆排序:不稳定,可能子节点与父节点进行交换时,将两个相同元素顺序打乱。

文章转载自测试备忘录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论