MySQL Using filesort 表示無法利用索引順序直接返回結果,需在內存/磁盤臨時表中排序,是慢查詢常見元兇。本文給出觸發條件、優化手段、參數調優、實戰檢查清單。
ORDER BY 列無索引、或索引順序不匹配(如 INDEX(a,b) 但 ORDER BY b,a)ORDER BY 混合 ASC/DESC(ORDER BY a ASC, b DESC,8.0 支持降序索引)GROUP BY 隱式排序(5.7 前)且無匹配索引JOIN 後 ORDER BY 非驅動表列LIMIT M,N 大偏移(需排序後再截取)INDEX (where_col, order_col),WHERE 列在前、ORDER BY 列在後,滿足最左前綴。INDEX (where_col, order_col, select_col),直接從索引葉子節點取數據,避免回表 + 排序。FORCE INDEX (idx_name) 讓優化器嘗試索引路徑(慎用,優化器通常更聰明)。sort_buffer_size (默認 256K) → 2M-8M,減少磁盤臨時表;max_length_for_sort_data (默認 1024) 控制是否用 rowid 排序模式。LIMIT 100000, 20 → 子查詢先取 ID WHERE id > (SELECT id FROM t ORDER BY id LIMIT 100000,1) 再回表。| 參數 | 默認 | 建議調整 | 影響 |
|---|---|---|---|
| sort_buffer_size | 256K | 2M-8M (會話級) | 超過則用磁盤臨時表 |
| max_length_for_sort_data | 1024 | 4096 | 行長度超過則用 rowid 模式(兩次讀取) |
| tmp_table_size / max_heap_table_size | 16M | 64M-256M | 內存臨時表上限,超過轉 MyISAM 磁盤表 |