MySQL 5.6新特性 MRR(Multi-Range Read Optimization)
阿新 • • 發佈:2021-11-22
官方網站:https://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html
多範圍讀取優化(MRR)
explain語句
- 當表很大且未儲存在儲存引擎的快取中時,使用二級索引上的範圍掃描讀取行可能會導致對基表的許多隨機磁碟訪問。
- 通過磁碟掃描多範圍讀取 (MRR) 優化,MySQL 通過首先僅掃描索引並收集相關行的鍵來嘗試減少範圍掃描的隨機磁碟訪問次數。
- 然後對鍵進行排序,最後使用主鍵的順序從基表中檢索行。
Disk-sweep MRR 的動機是減少隨機磁碟訪問的次數,而是實現對基表資料的更順序掃描。
MRR 允許基於索引元組按順序訪問資料行,而不是按隨機順序訪問。
- 伺服器獲取一組滿足查詢條件的索引元組,按照資料行ID的順序進行排序,並使用排序後的元組依次檢索資料行,使得資料訪問更加高效且成本更低。
- MRR 支援對需要通過索引元組訪問資料行的操作的鍵訪問請求進行批處理,例如範圍索引掃描和對連線屬性使用索引的等連線。
- MRR 迭代一系列索引範圍以獲得合格的索引元組,隨著這些結果的積累,它們被用於訪問相應的資料行,在開始讀取資料行之前不需要獲取所有索引元組。
MRR 可用於 InnoDB 和 MyISAM 表的索引範圍掃描和等連線操作
- 索引元組的一部分累積在緩衝區中
- 緩衝區中的元組按其資料行 ID 排序
- 根據排序的索引元組序列訪問資料行
圖片來自知乎
將行id排好序後,再去磁碟順序訪問資料,不會涉及到隨機訪問的各種磁碟排程,大大降低了訪問成本
MRR的好處
不涉及磁碟排程
磁碟和磁頭不再需要來回做機械運動
區域性性原理
在一次查詢中,每一頁的資料只會從磁碟讀取一次,可以充分利用磁碟預讀,大大減少磁碟IO
MySQL 從磁碟讀取頁的資料後,會把資料放到資料緩衝池,下次如果還用到這個頁,就不需要去磁碟讀取,直接從記憶體讀。
MRR配置
- mrr: on/off(開關)
- mrr_cost_based: on/off(基於使用 MRR 的成本,考慮使用 MRR 是否值得(cost-based choice),來決定具體的 sql 語句裡要不要使用 MRR)
如果你把 mrr_cost_based 設為 off,那優化器就會通通使用 MRR,即使只有一條資料
Mariadb 對 MySQL 的 MRR做了很多優化
- 一部分範圍(可能是單鍵範圍)在提交查詢的中央節點上的緩衝區中累積
- 範圍被髮送到訪問資料行的執行節點
- 訪問的行被打包成包併發送回中央節點,接收到的帶有資料行的包被放置在一個緩衝區中
- 從緩衝區讀取資料行
如果使用了覆蓋索引,MRR 沒有任何意義
對於 MRR,儲存引擎使用 read_rnd_buffer_size 系統變數的值作為它可以為其緩衝區分配多少記憶體的指南
引擎最多使用 read_rnd_buffer_size 位元組並確定要在單次傳遞中處理的範圍數
論讀書睜開眼,書在面前 閉上眼,書在心裡