聯系官方銷售客服
1835022288
028-61286886
情況描述:
當使用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 沒有這個優化,所以也就不會出現這個問題。
復制news 模塊,新建的jiaoshi 模塊。在列表頁中 使用 order=displayorder,調用列表時。同一條內容出現在第一個分頁,也會出現在第二個分頁。代碼經檢查沒問題啊。