MySQL 5.0+ 引入 Index Merge(索引合併),單查詢可使用多個單列索引取交集/並集。
三個單列索引 idx_firstname、idx_lastname、idx_age,優化器只會選擇過濾性最強的一個,遠弱於一個複合索引 idx_fname_lname_age。
複合索引 (firstname, lastname, age) 可服務以下查詢:
WHERE firstname = ? AND lastname = ? AND age = ?WHERE firstname = ? AND lastname = ?WHERE firstname = ?等價於隱式創建了三個索引:(fn,ln,age)、(fn,ln)、(fn)。
將多個索引的範圍掃描結果合併(Union/Intersection/Union-of-Intersections),僅限單表。
| 模式 | EXPLAIN Extra | 適用場景 |
|---|---|---|
| Union | Using union | OR 條件,各索引過濾性較好 |
| Sort-Union | Using sort_union | OR 條件,需先按 rowid 排序再合併 |
| Intersection | Using intersect | AND 條件,多單列索引取交集 |
減少回表次數,提升查詢效率;避免為每種組合創建複合索引導致寫入放大。
Handler_read_key 等狀態變量評估命中率EXPLAIN 觀察 key、Extra 確認是否觸發 Index Merge