首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 5.6 MRR (Multi-Range Read) 優化:二級索引範圍掃描回表的順序 IO 轉換術

     編輯:MySQL 綜合教學

MySQL 5.6 MRR (Multi-Range Read) 優化:二級索引範圍掃描回表的順序 IO 轉換術

背景痛點

二級索引範圍掃描需回表查詢聚簇索引 (主鍵) 獲取完整行。若命中行多且離散,會產生大量隨機 IO,在機械盤上性能極差。

MRR 核心原理

  1. 掃描二級索引,收集滿足條件的記錄的主鍵值。
  2. 在內存緩衝區 (read_rnd_buffer_size) 中按主鍵值排序。
  3. 按排序後的主鍵順序批量回表,將隨機 IO 轉為順序 IO。

適用場景:二級索引範圍掃描、使用二級索引的等值連接 (eq_ref/ref)。

官方文檔說明摘譯

Disk-Sweep MRR:先掃描索引收集鍵值 → 排序 → 按主鍵順序讀取基表。
優勢:1) 將隨機訪問轉為順序訪問;2) 支持批量處理鍵值訪問請求。

EXPLAIN 識別標誌

啟用 MRR 時,EXPLAIN 的 Extra 列顯示 Using MRR。

示例場景


-- 組合索引 (key_part1, key_part2)
SELECT * FROM t WHERE key_part1 >= 1000 AND key_part1 < 2000 AND key_part2 = 10000;
  • 無 MRR:掃描 key_part1 IN [1000, 2000) 所有二級索引條目,再回表過濾 key_part2=10000,讀取大量無用條目。
  • 有 MRR:將範圍拆解為 1000 個單點區間 [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_sizeMRR 緩衝區大小,決定單次能排序多少鍵值256KB

總結與適用性建議

  • MRR 專門優化 二級索引範圍掃描 + 回表 及 二級索引 JOIN。
  • 核心收益:隨機 IO → 順序 IO,機械盤提升顯著;SSD 隨機 IO 性能已強,收益相對較小但仍有價值 (減少請求併發壓力)。
  • 若查詢已走覆蓋索引 (不需回表),MRR 不生效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved