mysql分页 +order by 加 limit 导致出现重复?
   2022-10-24 16:01:34
mysql分页 +order by 加 limit 导致出现重复?
问题:
按某个非索引字段排序(如数据更新时间)进行分页查询时会出现有重复数据,比如在limit 0,5 和limit 5,5中有数据重复出现
原因:
在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,因为使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。即在完成select之后,所有记录是以堆排序的方法排列的,在进行order by时,仅把排序字段值大的往前移动。
解决方案:
在字段添加上索引,就直接按照索引的有序性进行读取并分页
再增加一个索引排序字段
扩展:
排序算法的稳定性:对于某一种排序算法,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序保持不变,那么就说这个排序算法是稳定的。
堆排序:堆是一种数据结构,一种叫做完全二叉树的数据结构。将数据构建成一个堆,再将堆顶的元素值和尾部的元素交换