盡可能使用索引、用最嚴格索引消除最多行、讓最終查找匹配行而非排除行。
mysql> EXPLAIN SELECT * FROM tbl_name WHERE 0\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Impossible WHERE
優化器識別 WHERE 0 無匹配行,直接返回 Impossible WHERE,完全不掃描表。
SELECT col3 FROM mytable
WHERE col1 = 'value1' AND col2 = 'value2';
假設:
col1 索引匹配 900 行col2 索引匹配 300 行優化器會先測試 col2(300 行 → 30 行,失敗 270 次),而非 col1(900 行 → 30 行,失敗 870 次),減少 I/O 與 CPU 開銷。
INT vs BIGINT、CHAR(10) vs VARCHAR(10) 視為相容CHAR(10) vs CHAR(12) 不相容,導致索引失效ALTER TABLE 統一型別WHERE YEAR(date_col) = 2023(函數導致全表掃描)WHERE date_col >= '2023-01-01' AND date_col < '2024-01-01'(索引生效)WHERE col1 + 1 = 100WHERE col1 = 99| 欄位 | 含義 | 關注重點 |
|---|---|---|
| type | 連線類型 | system > const > eq_ref > ref > range > index > ALL |
| possible_keys | 可能用到的索引 | 為空表示無索引可用 |
| key | 實際使用的索引 | 與 possible_keys 對比 |
| key_len | 索引長度 | 判斷組合索引用了幾列 |
| rows | 預估掃描行數 | 越小越好 |
| Extra | 額外資訊 | Using index / Using where / Using filesort / Using temporary |
type=ALL 的查詢建立索引Using filesort、Using temporarySELECT *,僅查詢所需欄位