1. 程式人生 > 其它 >MySQL優化之單路排序(多路排序)

MySQL優化之單路排序(多路排序)

一、應用場景

  • SQL未命中索引時,filesort所使用的演算法

二、產生原因

  • filesort:當SQL含有order等排序執行,並且欄位不命中索引;此時SQL執行檔案排序”filesort“

  • 排序演算法:4.1以前雙路排序、4.1之後單路排序

    • 雙路排序:兩次磁碟;取order欄位和資料指標進記憶體,排序完成後回表查詢其他資料

    • 單路排序:一次磁碟;取order欄位和其他所有欄位進記憶體,排序完後直接返回

    • 記憶體限制:sort_buffer_size每個程序記憶體緩衝區、max_length_for_sort_data每個執行快取資料量

三、解決方案

  • 案例

    # 表為 INSERT INTO TABLE A (F_ID,F_ID2,F_NAME) values(1,1,'NAME');
    # 假如列F_ID為主鍵索引,F_ID2為二級索引
    select F_ID2,F_NAME from A order by F_ID2;
    ## 雙路排序:第一次讀取磁碟F_ID2和隱藏行指標排序,然後回表查詢磁碟對應F_NAME
    ## 單路排序:第一次讀取磁碟F_ID2和F_NAME排序,然後直接返回結果
    

四、引數

引數 作用和優點 缺點
sort_buffer_size 存放待排序資料:資料量小於緩衝區時,記憶體排序 當資料量大於緩衝區,則進行普通磁碟排序
max_length_for_sort_data 資料行數;資料量決定排序演算法 當資料量較小時使用雙路排序,較大時使用單路排序