情况描述:

当使用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 没有这个优化,所以也就不会出现这个问题。

本文地址:https://m.xunruicms.com/doc/1269.html

  • 前台列表 分页数据重复了

    复制news 模块,新建的jiaoshi 模块。在列表页中 使用 order=displayorder,调用列表时。同一条内容出现在第一个分页,也会出现在第二个分页。代码经检查没问题啊。