sql 在排序后limit 查詢疑問


SELECT * FROM `br_spec` as `spec` order by sp_sort asc limit 0,10

SELECT * FROM `br_spec` as `spec` order by sp_sort 

添加limit后 列表順序發生變化

一、現象:
1、SELECT * FROM `br_spec` as `spec` order by sp_sort asc
 

 2、SELECT * FROM `br_spec` as `spec` order by sp_sort asc limit 0,10
 3、SELECT * FROM `br_spec` as `spec` order by sp_sort asc limit 1,10
 
發現第一條sql和第二條sql的排序順序不一樣
第二條和第三條數據有一定的重復

二、解決辦法:

使用兩次排序 
SELECT * FROM `br_spec` as `spec`  order by sp_sort asc,sp_id asc limit 0,10

三、問題出現原因:

“在MySQL 5.6的版本上,優化器在遇到order by limit語句的時候,做了一個優化,即使用了priority queue。……

使用 priority queue 的目的,就是在不能使用索引有序性的時候,如果要排序,並且使用了limit
n,那么只需要在排序的過程中,保留n條記錄即可,這樣雖然不能解決所有記錄都需要排序的開銷,但是只需要 sort buffer
少量的內存就可以完成排序。

之所以5.6出現了第二頁數據重復的問題,是因為 priority queue使用了堆排序的排序方法,而堆排序是一個不穩定的排序方法,也就是相同的值可能排序出來的結果和讀出來的數據順序不一致。

5.5 沒有這個優化,所以也就不會出現這個問題。

也就是說,mysql5.5是不存在本文提到的問題的,5.6版本之后才出現了這種情況。







 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM