情况描述:
当使用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://www.xunruicms.com/doc/1269.html技术求助:
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。