本文基於 MySQL 5.0 官方手冊優化章節,系統梳理 ORDER BY 索引優化、LIMIT 執行機制、全表掃描規避、INSERT/UPDATE/DELETE 加速策略 及其他進階優化技巧,為 SQL 調優提供實戰指南。
-- 1. 索引順序完全匹配
SELECT * FROM t1 ORDER BY key_part1, key_part2;
-- 2. WHERE 固定前綴,ORDER BY 後綴
SELECT * FROM t1 WHERE key_part1 = const ORDER BY key_part2;
-- 3. DESC 方向一致
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
核心原則:WHERE 條件中的常量等值匹配「佔用」了索引前綴,剩餘有序列可直接服務 ORDER BY。
ORDER BY key1, key2WHERE key2=const ORDER BY key_part2(key_part1 缺失)ORDER BY key1 DESC, key2 ASCWHERE key2=const ORDER BY key1EXPLAIN SELECT ... ORDER BY ...;
-- Extra 欄顯示 "Using filesort" 即未用索引
| 特性 | MySQL 4.1 前(原版) | MySQL 4.1+(改進版) |
|---|---|---|
| 緩存單元 | 雙元組:(sort_key, row_ptr) | 元組:(sort_key, row_ptr, select 列) |
| 讀取次數 | 兩次(WHERE 掃描 + 排序後隨機回表) | 一次(排序後直接從元組取列) |
| 內存佔用 | 較小 | 較大(受 max_length_for_sort_data 控制) |
| 適用條件 | 默認 | 元組大小超過閾值時自動啟用 |
sort_buffer_size:增大排序緩存(如 2M → 8M)read_rnd_buffer_size:增大隨機讀緩存tmpdir:指向高速磁盤/多盤輪詢(tmpdir=/disk1:/disk2:/disk3)LIMIT n + ORDER BY:找到 n 行即停止排序,避免全表排序LIMIT n + DISTINCT:找到 n 個唯一值即停止掃描GROUP BY + LIMIT:按索引序讀取時,僅計算必要組LIMIT 0:快速獲取列類型/驗證語法,返回空集SQL_CALC_FOUND_ROWS:需掃描全量才能獲取總行數,慎用-- 1. 更新統計信息
ANALYZE TABLE tbl_name;
-- 2. 強制使用索引
SELECT * FROM t1 FORCE INDEX (idx_col) WHERE col = ...;
-- 3. 調整優化器預期
SET max_seeks_for_key = 1000; -- 或啟動參數 --max-seeks-for-key=1000
連接(3) + 發送查詢(2) + 解析(2) + 插入記錄(1×行大小) + 更新索引(1×索引數) + 關閉(1)
INSERT INTO t VALUES (1),(2),(3)... 比單條快數倍CREATE TABLE t ...;
FLUSH TABLES;
myisamchk --keys-used=0 -rq /path/to/t; -- 刪除索引
LOAD DATA INFILE 'data.txt' INTO TABLE t;
myisamchk -r -q /path/to/t; -- 重建索引(內存排序,極快)
FLUSH TABLES;
# MySQL 4.0+ 可用 ALTER TABLE t DISABLE/ENABLE KEYS 替代 myisamchk
LOCK TABLES t WRITE; INSERT ...; UNLOCK TABLES; 減少索引刷盤次數OPTIMIZE TABLE 整理碎片TRUNCATE TABLE(DDL,無事務日志,極快)key_buffer_size 加速索引定位thread_cache_sizeALTER TABLE ... ORDER BY col1, col2 物理順序匹配高頻查詢hash_col=MD5(CONCAT(col1,col2))--skip-innodb --delay-key-write=ALL 提速--myisam-recover 保安全)MySQL 優化無銀彈,核心是 「用索引替代掃描、用順序替代隨機、用批量替代單條、用內存替代磁盤」。結合 EXPLAIN、SHOW PROFILE、Performance Schema 量化分析,針對具體業務場景組合參數調優與 SQL 重寫,方能獲得穩定收益。