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

迅睿教程 0 来源:老K模板网 收藏
情况描述:

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


免责声明:1.凡本站注明“来源:XXX(非老K模板网)”的作品,均转载自其它媒体,所载的文章、图片、音频视频文件等资料的版权归版权所有人所有,如有侵权,请联系laokcms#126.com处理;2.凡本站转载内容仅代表作者本人观点,与老K模板网无关。
0 条评论

网友留言