Mysql

同一條記錄在有序分頁查詢中多次出現

  • July 21, 2019

一些記錄顯示在多個結果“頁面”上,查詢如下:

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都是onlineint(11)不是外鍵)
  • SELECT如果我從子句中刪除兩個欄位之一(都是varchar(255),不是外鍵)
  • 如果我刪除架構中的一些表或欄位。但是,經過數小時的努力,我仍然無法確定哪些表/欄位有影響,哪些沒有。看起來像隨機的(即使我知道不是)。因此,我不在這裡粘貼任何CREATE TABLEINSERT聲明,因為我認為它們不相關。

我唯一可以肯定的是,如果我mysqldump將所有表都恢復到新模式中,問題仍然存在。

(表中還有其他欄位,但添加/刪除它們對結果沒有影響)。

問題:

  1. 如果我得出結論認為我的架構中的某些內容已損壞,我是對的嗎?
  2. 我該如何解決這個問題?

(MySQL 版本:5.6.24 Win32 x86)

我有一些壞消息要告訴你:根據 MySQL,這不是 BUG !!!

有兩個關於此行為的錯誤報告,被認為是非關鍵的

這是Bug #69732 中表達的基本原理

如果沒有不同的 ORDER BY,則結果順序是未定義的。時期。

即使相同的查詢,執行兩次,結果的順序不同,這也沒有錯。您可能已經習慣了看似確定性的結果,但這實際上是一種錯覺。這可能是您在通常情況下看到的,但沒有什麼可以保證這一點。結果順序可以隨著統計數據的更新而改變,因為索引樹被重新洗牌,因為數據在不同的物理機器上進行分區,因此結果順序取決於網路延遲……

因此,如果您想要分頁,請確保您對保證是唯一的東西進行排序,或者接受這樣一個事實,即非唯一序列中相同值的排序順序不是確定性的,並且可以隨時更改,恕不另行通知。

在您的特定情況下,該online欄位可能不夠明顯。即使您bbr_bar按 ( country_id, online) 進行索引,這可能仍然不夠明顯。您可能必須涉及另一列來驅動排序順序(可能是自動遞增欄位或時間戳欄位)。

試一試!!!!

引用自:https://dba.stackexchange.com/questions/123737