定義表:算法
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 KEY (`id`),
KEY `city` (`city`)
) ENGINE=InnoDB;
待查詢的sql語句:
select city,name,age from t where city='杭州' order by name limit 1000 ;
複製代碼
sort_buffer_size定義:
MySQL爲排序開闢的內存(sort_buffer)的大小。若是要排序的數據量小於sort_buffer_size,排序就在內存中完成。但若是排序數據量太大,內存放不下,則不得不利用磁盤臨時文件輔助排序sql
經過查看 OPTIMIZER_TRACE,number_of_tmp_files表示排序使用的臨時文件數,外部排序通常使用歸併排序算法。MySQL 將須要排序的數據分紅 12 份,每一份單獨排序後存在這些臨時文件中。而後把這 12個有序文件再合併成一個有序的大文件bash
執行過程:ui
該過程稱爲全字段排序spa
若是查詢返回字段不少的,MySQL會將須要排序的列和主鍵放入sort_buffer,此時執行流程爲:code
這個過程稱爲rowid排序,相比較全字段排序,它只取了排序字段和主鍵再內存中進行排序,排序結束後還須要遍歷主鍵索引樹,取出須要查詢的值,這個回表的過程比較耗時。cdn
注:blog
若是order by後面的字段走聯合索引,聯合索引中的數據有順序的,好比(city, name, age)三個字段組成聯合索引,會按照city排序,再按照name排序,最後按照age排序,這樣查詢的出的結果集能夠直接返回,不須要使用sort_buffer內存進行排序,能夠使用explain查看extra屬性是否有Using filesort。排序