Mysql
同一條記錄在有序分頁查詢中多次出現
一些記錄顯示在多個結果“頁面”上,查詢如下:
SELECT `description`, `wallpaper` FROM `bbr_bar` WHERE `country_id` = '2510769' ORDER BY `online` DESC
例如,id 為 99 的記錄顯示在第一個“頁面”(
LIMIT 10 OFFSET 0
)上,但也顯示在最後一個“頁面”上LIMIT 10 OFFSET 50
。顯然這不應該發生。在以下情況下問題消失:
- 如果我不過濾查詢,或者不訂購它(兩者
country_id
都是online
,int(11)
不是外鍵)SELECT
如果我從子句中刪除兩個欄位之一(都是varchar(255)
,不是外鍵)- 如果我刪除架構中的一些表或欄位。但是,經過數小時的努力,我仍然無法確定哪些表/欄位有影響,哪些沒有。看起來像隨機的(即使我知道不是)。因此,我不在這裡粘貼任何
CREATE TABLE
或INSERT
聲明,因為我認為它們不相關。我唯一可以肯定的是,如果我
mysqldump
將所有表都恢復到新模式中,問題仍然存在。(表中還有其他欄位,但添加/刪除它們對結果沒有影響)。
問題:
- 如果我得出結論認為我的架構中的某些內容已損壞,我是對的嗎?
- 我該如何解決這個問題?
(MySQL 版本:5.6.24 Win32 x86)
我有一些壞消息要告訴你:根據 MySQL,這不是 BUG !!!
有兩個關於此行為的錯誤報告,被認為是非關鍵的
- MySQL 5.6(錯誤 #69732:LIMIT 子句導致跨頁重複數據)
- MySQL 5.5(錯誤 #65307:order by 和 limit offset 的問題)
如果沒有不同的 ORDER BY,則結果順序是未定義的。時期。
即使相同的查詢,執行兩次,結果的順序不同,這也沒有錯。您可能已經習慣了看似確定性的結果,但這實際上是一種錯覺。這可能是您在通常情況下看到的,但沒有什麼可以保證這一點。結果順序可以隨著統計數據的更新而改變,因為索引樹被重新洗牌,因為數據在不同的物理機器上進行分區,因此結果順序取決於網路延遲……
因此,如果您想要分頁,請確保您對保證是唯一的東西進行排序,或者接受這樣一個事實,即非唯一序列中相同值的排序順序不是確定性的,並且可以隨時更改,恕不另行通知。
在您的特定情況下,該
online
欄位可能不夠明顯。即使您bbr_bar
按 (country_id
,online
) 進行索引,這可能仍然不夠明顯。您可能必須涉及另一列來驅動排序順序(可能是自動遞增欄位或時間戳欄位)。試一試!!!!