电话
13363039260
情况描述:
当使用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 没有这个优化,所以也就不会出现这个问题。