,mysql實戰45講學習筆記--16

16 “Order by”是怎麼工作的

        全字段排序
       MySQL會給每個線程分配一塊內存用於排序,稱爲sort_buffer。
在這裏插入圖片描述

       通常情況下,語句執行流程如下
       1.初始化sort_buffer,確定放入name,city,age三個字段;
       2.從索引City找到第一個滿足city=”杭州”條件的主鍵id,也就是ID_X
       3.到主鍵id索引取出整行,取name,city,age三個字段的值,存入sort——buffer中
       4.從索引city取下一個記錄的主鍵id
       5.重複3.4直到city的值不滿足查詢條件爲止,對應的主鍵id也就是ID_Y
       6.對sort_buffer中的數據按照字段name做快速排序
       7.按照排序結果取前1000行返回給客戶端

       按name排序可能在內存中完成,也可能使用外部排序,取決於排序所需內存和參數sort_buffer_size
       sort_buffer_size,就是爲排序開闢的內存(sort_buffer)的大小。如果排序數據量小於sort_buffer_size,就是在內存中完成。

       內存放不下,就需要外部排序,外部排序一般使用歸併排序算法。
       Mysql把需要排序的數據分成12份,每一份單獨排序後存在這些零時文件中,然後把這12個有序文件合併成一個有序的大文件

Rowid排序

       如果單行的長度超過max_length_for_sort_data這個值,就會認爲單行太大,需要換一個算法。
在這裏插入圖片描述

       Rowid排序多訪問一次表t的主鍵索引

全字段排序vs rowid排序

       Mysql實在擔心排序內存太小,會影響排序效率纔會採用rowid算法,這樣排序過程一次可以排更多行,但是需要回到原表取數據。
       認爲內存足夠大,會優先選擇全字段排序,把需要的字段都放到sort_buffer中,這樣排序後就會直接從內存裏面返回查詢結果,不用再到原表取數據。
       如果內存夠,就要多利用內存,儘量減少磁盤訪問。

       如果從索引上取下來的行,天然就是按照遞增排序的,就不用再排序
       如果使用覆蓋索引,那麼索引上的信息足夠滿足查詢請求,就不需要再回到主鍵索引上取數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章