日常的開發中,總是會碰到排序的需求, 一般的排序都是使用order by 的語句的,但是order by 語句的作用機制是怎樣的呢?
extra 這個欄位中的「using filesort」表示的就是需要排序,mysql 會給每個執行緒分配一塊記憶體用於排序,稱為 sort_buffer。 看到使用id的時候,並沒有使用using filesort, 這是因為 id欄位本來就是有序的,取出的資料本身就是有序的,不用在排序了, 而使用name欄位排序就需要使用sort_buffer了。
先根據查詢語句查詢出來符合符合的記錄, 把記錄放入到sort_buffer記憶體空間中
對於sort_buffer中的記錄進行按照條件快速排序,
如果sort_buffer裝不下所有的記錄會建立臨時檔案來裝載記錄。
使用了臨時檔案會使用歸併排序來進行排序的, (確實歸併排序最符合這種情況)
排序完成後返回符合要求的記錄
sort_buffer的大小是可以設定大小的, 如果sort_buffer大小夠用,就不會使用臨時檔案來輔助排序了。
如果一行記錄很大,比如包含text型別的字段, 這個時候全部放入sort_buffer空間就很不划算了, 這個時候mysql會進行優化, 比如按照name欄位排序, 這個時候只會取得name欄位和id欄位兩個欄位的資料放入sort_buffer中排序, 排序完成後要返回完整的記錄的時候,在根據id回表來獲取完整記錄。
mysql會根據每行記錄的具體長度來決定是全部放入sort_buffer還是只放排序字段。 這個具體長度的值是可以設定的, setmax_length_for_sort_data =16; 就是設定長度超過16後就不放入完整欄位了
全欄位排序是記憶體夠用的情況下採取的排序方式, 記憶體夠用就會減少回表操作。
如果記憶體不夠大, 就會使用臨時檔案來排序,
mysql的設計思想就是 記憶體夠用就盡量使用記憶體, 減少磁碟的使用。 mysql的會盡量避免磁碟讀的。
並不是所有的排序都要使用這個的, 如果從表中取得的資料本身就是符合的排序要求的就沒有必要使用這個排序記憶體。
如果我們對於某幾個字段經常進行排序查詢, 可以使用覆蓋索引,保證覆蓋索引的順序是符合要求的,那麼排序的時候就沒有必要再使用sort_buffer了。
mysql的order by導致很慢
mysql的order by導致很慢 解決方法 我解決的方法是使用force index強制使用索引,為tcug datetime欄位新建乙個名字為tcug datetime的索引 normal btree selecta.tcug datetime from manage.tb crm files...
MySQL中order by的工作原理
假設有查詢語句 select city,name,age from t where city 杭州 order by name limit 1000,且city上建立索引。mysql為order by排序開闢的記憶體稱為sort buffer,如果要排序的資料量小於這塊記憶體,則在記憶體中進行排序。...
mysql的orderby是如何工作的
1.建表語句 create table t id int 11 not null,city varchar 16 not null,name varchar 16 not null,age int 11 not null,addr varchar 128 default null,primary k...