sort_buffer_size、tmp_table_size 等參數,減少磁盤臨時表。sort_buffer_size:排序緩衝區,建議 2M~8M(按連接分配,慎設過大)。tmp_table_size/max_heap_table_size:內存臨時表上限,超過轉磁盤 MyISAM 表,拖慢速度。read_rnd_buffer_size:隨機讀緩衝,輔助排序讀取。SELECT * FROM ad_user WHERE is_active='y' ORDER BY value;
-- 建立索引:INDEX idx_active_value (is_active, value)
-- 或單列 INDEX (value) 若 WHERE 選擇性高
索引順序與 ORDER BY 方向一致(均 ASC 或均 DESC)時,可直接按索引掃描返回,零排序開銷。
SELECT * FROM abb ORDER BY id DESC, aid ASC;
MySQL 無法利用單一索引同時滿足相反排序方向,必須 Filesort。解決思路:
SELECT id, value FROM ... ORDER BY value 若索引包含所有查詢列,避免回表。ORDER BY value LIMIT 10 可配合索引快速定位 Top-N。EXPLAIN SELECT * FROM ad_user WHERE is_active='y' ORDER BY value;
-- 觀察 Extra 欄位:
-- "Using index" → 覆蓋索引,無回表
-- "Using filesort" → 產生臨時排序,需優化
-- "Using index; Using filesort" → 用到索引但仍需排序(如混合 ASC/DESC)