每表最多 16 個索引,支援多欄索引與全文索引。建立:
CREATE INDEX idx_username ON users(username);
驗證:SHOW INDEX FROM users;
雙刃劍:過多索引拖慢寫入,需在「查詢快」與「寫入快」間找平衡,依表主要業務 (讀多寫少/寫多讀少) 決策。
關鍵欄位:
type:system > const > eq_ref > ref > range > index > ALL (越左越好)possible_keys / key:可用/實際用到的索引rows:預估掃描行數 (越少越好)Extra:Using index (覆蓋索引)、Using where、Using temporary、Using filesort (需優化)
-- 原查詢:city 表全掃 4079 行
EXPLAIN SELECT city.name, city.district
FROM city, country
WHERE city.countrycode = country.code AND country.code = 'IND';
-- type=ALL, rows=4079
-- 加索引
CREATE INDEX idx_ccode ON city(countrycode);
-- 再看:type=ref, rows=333 (降低 92%)
| 參數 | 作用 | 建議起始值 |
|---|---|---|
key_buffer_size | 索引塊緩存 (MyISAM 關鍵) | 物理記憶體 25% |
read_buffer_size | 全表掃描順序讀緩存 | 1-2 MB |
sort_buffer_size | ORDER BY/GROUP BY 排序緩存 | 1-2 MB (Session 級可調大) |
join_buffer_size | 無索引 JOIN 緩存 | 1-2 MB |
read_rnd_buffer_size | 隨機讀/排序後讀取緩存 | 1 MB |
table_cache / table_open_cache | 可同時開啟表數 | 配合 max_connections 調大 |
long_query_time | 慢查詢門檻 (秒) | 1-2 秒 (5.1.21+ 支援微秒) |
log_slow_queries | 開啟慢查詢日誌 | ON |
log_queries_not_using_indexes | 記錄無索引查詢 | ON |
EXPLAIN 分析執行計畫,補索引、改 SQLSHOW GLOBAL STATUS 命中率