MySQL order by工作機制

2021-10-05 09:59:51 字數 821 閱讀 7854

當使用order by對查詢結果進行排序時,mysql會給每個執行緒分配一塊兒記憶體sort_buffer用於排序,在使用索引的情況下,整個的排序過程如下所述:

1. 初始化sort_buffer,確定放入結果中所需的字段;

2. 從索引中找到第乙個滿足條件主鍵id;

3. 到主鍵id索引取出整行,取所需字段的值,存入sort_buffer中;

4. 從索引中取下乙個記錄的主鍵id;

5. 重複步驟3、4直到索引中的值不滿足查詢條件為止;

6. 對sort_buffer中的資料按照order by的字段做快速排序;

7. 根據limit語句按照排序結果取前n行返回給客戶端

其中第六步的排序,如果記憶體大小不夠則可能使用外部檔案進行排序,快取大小取決於sort_buffer_size,如果使用外部檔案,則採用類似於歸併排序的方式

當結果中需要的字段過多時 ,每行記錄比較大,可能會發生sort_buffer只能放下很少的記錄的情況,這時,需要的就是rowid排序。max_length_for_sort_data用於控制快取中每行能放下的資料大小,如果不能將所需字段都放進去,則會選擇order by中需要的字段放進去,其餘的字段通過回表的方式,將第7步改為:遍歷排序結果,取前n行,並按照id的值回到原表中取出所需欄位返回給客戶端。也是由於這個回表過程的存在,所以mysql會優先選擇第一種方法,盡量避免rowid方式,此外還可以通過覆蓋索引的方式再次減少回表過程。

mysql實戰45講

《Mysql Order By 的工作原理?》

一 概述 order by 用於 sql 語句中的排序。以 select city,name,age from t where city 杭州 order by name limit 1000 舉例,來了解下排序的工作原理。為了避免其他因素的影響,我們為 city 字段加上索引。二 分析排序 分析 ...

mysql order by是怎麼工作的?

假設我們要查詢乙個市民表中城市 杭州的所有人的名字,並且按照名字排序 create table t id int 11 not null city varchar 16 not null name varchar 16 not null age int 11 not null addr varcha...

MySQL Order By索引優化

mysql order by索引優化 mysql可以直接使用索引來滿足乙個order by 子句而無需做額外的排序。儘管 order by 不是和索引的順序準確匹配,索引還是可以被用到。在一些情況下,mysql可以直接使用索引來滿足乙個 order by 或 group by 子句而無需做額外的排序...