MySQL排序會增加Sort_merge_passes ,MySQL 就會把每次在內存中排序的結果存到臨時文件中,找到記錄後,會再次排序。
MySQL排序使用情況:
- MySQL> show global status like 'sort%';
- +-------------------+------------+
- | Variable_name | Value |
- +-------------------+------------+
- | Sort_merge_passes | 29 |
- | Sort_range | 37432840 |
- | Sort_rows | 9178691532 |
- | Sort_scan | 1860569 |
- +-------------------+------------+
Sort_merge_passes 包括兩步。MySQL 首先會嘗試在內存中做排序,使用的內存大小由系統變量 Sort_buffer_size 決定,如果它的大小不夠把所有的記錄都讀到內存中,MySQL 就會把每次在內存中排序的結果存到臨時文件中,等 MySQL 找到所有記錄之後,再把臨時文件中的記錄做一次排序。
再次排序就會增加 Sort_merge_passes。實際上,MySQL 會用另一個臨時文件來存再次排序的結果,所以通常會看到 Sort_merge_passes 增加的數值是建臨時文件數的兩倍。
因為用到了臨時文件,所以速度可能會比較慢,增加 Sort_buffer_size 會減少 Sort_merge_passes 和 創建臨時文件的次數。但盲目的增加 Sort_buffer_size 並不一定能提高速度。
另外,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值對排序的操作也有一點的好處。