1. 程式人生 > 其它 >MySQL---order by如何工作

MySQL---order by如何工作

技術標籤:mysql技術

記憶體排序

sort_buffer_size,就是 MySQL 為排序開闢的記憶體(sort_buffer)的大小。如果要排序的資料量小於 sort_buffer_size,排序就在記憶體中完成。但如果排序資料量太大,記憶體放不下,則不得不利用磁碟臨時檔案輔助排序。

你可以用下面介紹的方法,來確定一個排序語句是否使用了臨時檔案。

/* 開啟optimizer_trace,只對本執行緒有效 */
SET optimizer_trace='enabled=on'; 

/* @a儲存Innodb_rows_read的初始值 */
select VARIABLE_VALUE into @a from  performance_schema.session_status where variable_name = 'Innodb_rows_read';

/* 執行語句 */
select city, name,age from t where city='杭州' order by name limit 1000; 

/* 檢視 OPTIMIZER_TRACE 輸出 */
SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G

/* @b儲存Innodb_rows_read的當前值 */
select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'Innodb_rows_read';

/* 計算Innodb_rows_read差值 */
select @
[email protected]
;

number_of_tmp_files 來看是否使用了臨時檔案:

rowid排序

SET max_length_for_sort_data = 16;

max_length_for_sort_data,是 MySQL 中專門控制用於排序的行資料的長度的一個引數。它的意思是,如果單行的長度超過這個值,MySQL 就認為單行太大,要換一個演算法

如果 MySQL 實在是擔心排序記憶體太小,會影響排序效率,才會採用 rowid 排序演算法,這樣排序過程中一次可以排序更多行,但是需要再回到原表去取資料。

如果 MySQL 認為記憶體足夠大,會優先選擇全欄位排序,把需要的欄位都放到 sort_buffer 中,這樣排序後就會直接從記憶體裡面返回查詢結果了,不用再回到原表去取資料。

這也就體現了 MySQL 的一個設計思想:如果記憶體夠,就要多利用記憶體,儘量減少磁碟訪問。

對於 InnoDB 表來說,rowid 排序會要求回表多造成磁碟讀,因此不會被優先選擇。

覆蓋索引是指,索引上的資訊足夠滿足查詢請求,不需要再回到主鍵索引上去取資料。