【問題日期】
- 2022-11-14 22:45:12
【問題描述】
- MySQL 排序字段數據相同不能分頁問題:在分頁查詢數據時,按創建時間排序,由于數據是批量創建的,導致部分數據創建時間一樣,而此時分頁查詢數據,翻頁后出現重復數據
【問題拆解】
- 分頁查詢數據
- 按照創建時間排序&存在創建時間相同的數據
- 翻頁后出現重復數據
【問題來源】
- 朋友遇到的
【可能原因】
- 是因為排序字段只有創建時間
【參考鏈接】
-
MySQL 官方文檔:
-
https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
-
If multiple rows have identical values in the
ORDER BY
columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns. -
如果多行在列中具有相同的值
ORDER BY
,則服務器可以自由地以任何順序返回這些行,并且可能會根據整體執行計劃以不同的方式返回。換句話說,這些行的排序順序對于無序的列是不確定的。
-
-
51CTO 博客 - 《MySQL排序字段數據相同不能分頁問題》:
-
https://blog.51cto.com/u_15704340/5439010
-
如果 order by 排序的字段有相同的數據,則服務器可以自由地以任何順序返回這些行,并且可能會根據整體執行計劃以不同的方式返回。
-
【解決方案】
- 可以在 order by 后面加上一個唯一的 id
【問題總結】
- 如果多行在列中具有相同的值
ORDER BY
,則服務器可以自由地以任何順序返回這些行,并且可能會根據整體執行計劃以不同的方式返回。換句話說,這些行的排序順序對于無序的列是不確定的。 - 對于帶有
ORDER BY
或GROUP BY
和LIMIT
子句的查詢,優化器會在默認情況下嘗試選擇有序索引,因為這樣做會加快查詢執行速度。在 MySQL 5.7.33 之前,無法覆蓋此行為,即使在使用其他優化可能更快的情況下也是如此。從 MySQL 5.7.33 開始,可以通過將optimizer_switch
系統變量的prefer_ordering_index
標志設置為off
.