一、问题描述
执行以下sql,在数据没有插入删除的情况下,返回的数据可能不一致,导致线上出现重复数据
select xxx from table where xxx order by xxx limit offset
二、产生原因
在mysql 5.6
版本,mysql
对order by limit
做了一个优化,使用了priority queue
,priority queue
使用的是堆排序策略,在排序过程中虽然还要对n个数据进行排序,但是只需要消耗堆大小的内存就可以完成排序,提高了排序的空间效率。
直接原因: 堆排序是不稳定的,当order by字段一致时,会造成输出结果顺序不一致。
官方文档:文档中明