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
 

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

2、解決辦法:

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

3、問題出現緣由:

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

使用 priority queue 的目的,就是在不能使用索引有序性的時候,若是要排序,而且使用了limit
n,那麼只須要在排序的過程當中,保留n條記錄便可,這樣雖然不能解決全部記錄都須要排序的開銷,可是隻須要 sort buffer
少許的內存就能夠完成排序。sql

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

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

也就是說,mysql5.5是不存在本文提到的問題的,5.6版本以後纔出現了這種狀況。
ui







 


相關文章
相關標籤/搜索