二級索引範圍掃描需回表查詢聚簇索引 (主鍵) 獲取完整行。若命中行多且離散,會產生大量隨機 IO,在機械盤上性能極差。
read_rnd_buffer_size) 中按主鍵值排序。適用場景:二級索引範圍掃描、使用二級索引的等值連接 (eq_ref/ref)。
Disk-Sweep MRR:先掃描索引收集鍵值 → 排序 → 按主鍵順序讀取基表。
優勢:1) 將隨機訪問轉為順序訪問;2) 支持批量處理鍵值訪問請求。
啟用 MRR 時,EXPLAIN 的 Extra 列顯示 Using MRR。
-- 組合索引 (key_part1, key_part2)
SELECT * FROM t WHERE key_part1 >= 1000 AND key_part1 < 2000 AND key_part2 = 10000;
key_part1 IN [1000, 2000) 所有二級索引條目,再回表過濾 key_part2=10000,讀取大量無用條目。[1000,10000], [1001,10000] ... [1999,10000],每個區間只讀取匹配 key_part2 的條目,大幅減少索引讀取與回表次數。| 參數 | 說明 | 默認值 |
|---|---|---|
optimizer_switch='mrr=on/off' | 總開關 | on |
optimizer_switch='mrr_cost_based=on/off' | on=優化器基於成本決定是否用 MRR;off=只要可能就用 | on |
read_rnd_buffer_size | MRR 緩衝區大小,決定單次能排序多少鍵值 | 256KB |