1、問題復現
現象:
mysql對無索引字段進行排序后limit ,當被排序字段有相同值時并且在limit范圍內,取的值并不是正常排序后的值,有可能第一頁查詢的記錄,重復出現在第二頁的查詢記錄中,而且第二頁的查詢結果亂序,導致分頁結果查詢錯亂問題。
舉個例子,假設有一張名為"users"的表,包含以下字段:id、name、age,以及要按照age字段進行升序排序進行分頁查詢的需求。
SELECT * FROM users ORDER BY age ASC LIMIT 10 OFFSET 20;
假設在60到70行之間,有多個記錄具有相同的age值,如下所示:
id | name | age
---------------
21 | John | 25
22 | Lisa | 26
23 | Amy | 26
24 | Jack | 26
25 | Mark | 27
26 | Ella | 27
...
根據上述查詢語句,期望返回age字段從小到大排序的第21行到第30行。然而,由于age字段為26的記錄有多個,MySQL在這個相同排序字段的情況下沒有保證記錄的順序不變,可能會導致查詢結果的順序錯亂。
2、解決方案
解決這個問題的一種方法是在排序字段之后再添加一個唯一標識字段,例如id字段。這樣,通過對排序字段和唯一標識字段進行排序,可以確保查詢結果的順序正確。
SELECT * FROM users ORDER BY age ASC, id ASC LIMIT 10 OFFSET 20;
通過這種方式,即使排序字段的值相同,記錄的順序也會保持一致,從而避免了分頁查詢結果順序錯亂的問題。