1.MySQL會為每個線程分配一個內存(sort_buffer)用于排序該內存大小為sort_buffer_size
1>如果排序的數據量小于sort_buffer_size,排序將會在內存中完成
2>如果排序數據量很大,內存中無法存下這么多數據,則會使用磁盤臨時文件來輔助排序,也稱外部排序
3>在使用外部排序時,MySQL會分成好幾份單獨的臨時文件用來存放排序后的數據,然后在將這些文件合并成一個大文件
2.mysql會通過遍歷索引將滿足條件的數據讀取到sort_buffer,并且按照排序字段進行快速排序
1>如果查詢的字段不包含在輔助索引中,需要按照輔助索引記錄的主鍵返回聚集索引取出所需字段
2>該方式會造成隨機IO,在MySQL5.6提供了MRR的機制,會將輔助索引匹配記錄的主鍵取出來在內存中進行排序,然后在回表
3>按照情況建立聯合索引來避免排序所帶來的性能損耗,允許的情況下也可以建立覆蓋索引來避免回表
全字段排序
1.通過索引將所需的字段全部讀取到sort_buffer中
2.按照排序字段進行排序
3.將結果集返回給客戶端
缺點:
1.造成sort_buffer中存放不下很多數據,因為除了排序字段還存放其他字段,對sort_buffer的利用效率不高
2.當所需排序數據量很大時,會有很多的臨時文件,排序性能也會很差
優點:MySQL認為內存足夠大時會優先選擇全字段排序,因為這種方式比rowid 排序避免了一次回表操作
rowid排序
1.通過控制排序的行數據的長度來讓sort_buffer中盡可能多的存放數據,max_length_for_sort_data
2.只將需要排序的字段和主鍵讀取到sort_buffer中,并按照排序字段進行排序
3.按照排序后的順序,取id進行回表取出想要獲取的數據
4.將結果集返回給客戶端
優點:更好的利用內存的sort_buffer進行排序操作,盡量減少對磁盤的訪問
缺點:回表的操作是隨機IO,會造成大量的隨機讀,不一定就比全字段排序減少對磁盤的訪問
3.按照排序的結果返回客戶所取行數