sql 在排序後limit 查詢疑問

2022-07-20 17:03:10 字數 1283 閱讀 2098

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後 列表順序發生變化

一、現象:

發現第一條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版本之後才出現了這種情況。

mysql orderby limit 翻頁資料重複的問題 - web烤貓 - segmentfault - 360極速瀏覽器

null

SQL查詢排序

確定資料 from 表名稱 別名 確定滿足條件的資料行 where 過濾條件 s 控制要顯示的資料列 select distinct 列名稱 別名 針對查詢結構進行排序 order by 字段 asc desc 字段 asc desc 預設情況下選擇asc公升序排列。因為在select 之後執行,所...

SQL資料庫查詢LIMIT 資料分頁

sql資料庫查詢limit 資料分頁 sql的語句limit 約束select 查詢資料包表時,使得sql查詢語句返回指定的記錄數 行數 limit 可以設定1個或2個int整型常量數字作為引數。limit在資料分頁查詢時候十分有用,因為不是每一次查詢都需要 select from table 這麼...

mysql先排序後判斷 mysql 排序後在查詢

今天寫sql 的時候,遇到乙個問題,有乙個圖書表和乙個章節表 book chapter 我需要隨機五本書,並且獲取這五本書的最新章節和標題 rank代表多少章 我的sql是 select t.from select b.c.rank,c.title from book b inner join ch...