聯(lián)系官方銷售客服
1835022288
028-61286886
情況描述:
當(dāng)使用order排序時(shí),在分頁(yè)條件下,上頁(yè)出現(xiàn)了某某數(shù)據(jù)id=123,下頁(yè)或其他頁(yè)又會(huì)出現(xiàn)id=123的內(nèi)容,導(dǎo)致重復(fù)數(shù)據(jù)顯示。
分析問題:
在MySQL 5.6的版本上,優(yōu)化器在遇到order by limit語(yǔ)句的時(shí)候,做了一個(gè)優(yōu)化,即 使用了priority queue。
使用 priority queue 的目的,就是在不能使用索引有序性的時(shí)候,如果要排序,并且使用了limit n,那么只需要在排序的過(guò)程中,保留n條記錄即可,這樣雖然不能解決所有記錄都需要排序的開銷,但是只需要 sort buffer 少量的內(nèi)存就可以完成排序。
之所以MySQL 5.6出現(xiàn)了第二頁(yè)數(shù)據(jù)重復(fù)的問題,是因?yàn)?priority queue 使用了堆排序的排序方法,而堆排序是一個(gè)不穩(wěn)定的排序方法,也就是相同的值可能排序出來(lái)的結(jié)果和讀出來(lái)的數(shù)據(jù)順序不一致。
解決方案:
方案1:在字段添加上索引,就直接按照索引的有序性進(jìn)行讀取并分頁(yè)。
方案2:order參數(shù)分配給不唯一的字段,例如id,時(shí)間等字段。
方案3:將mysql版本降級(jí)到5.5,MySQL 5.5 沒有這個(gè)優(yōu)化,所以也就不會(huì)出現(xiàn)這個(gè)問題。
復(fù)制news 模塊,新建的jiaoshi 模塊。在列表頁(yè)中 使用 order=displayorder,調(diào)用列表時(shí)。同一條內(nèi)容出現(xiàn)在第一個(gè)分頁(yè),也會(huì)出現(xiàn)在第二個(gè)分頁(yè)。代碼經(jīng)檢查沒問題啊。