MySQL分页时使用 limit order by 会出现数据重复问题

2024-01-27 14:13 小编
情况描述:

当使用order排序时,在分页条件下,上页出现了某某数据id=123,下页或其他页又会出现id=123的内容,导致重复数据显示。


分析问题:

在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即 使用了priority queue。

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

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


解决方案:

方案1:在字段添加上索引,就直接按照索引的有序性进行读取并分页。

方案2:order参数分配给不唯一的字段,例如id,时间等字段。

方案3:将mysql版本降级到5.5,MySQL 5.5 没有这个优化,所以也就不会出现这个问题。


在线咨询 拨打电话

电话

13363039260

微信二维码

微信二维码