MySQL Multi-Range Read(MRR 索引多範圍查找) 原理與解析

原理:mysql

若是基表很大,數據沒有被緩存,在二級索引上使用範圍掃描讀取行可能會致使大量的隨機磁盤訪問。使用Multi-Range Read新特性,mysql能夠減小對磁盤的隨機讀的次數:首先,mysql只是掃描索引,收集相關行的keys;而後,將收集到的keys進行排序;最後經過有序的主鍵去訪問基表。sql

Multi-Range Read特性的目的就是減小對磁盤的隨機訪問,進而對基表執行更多的順序掃描。

使用MRR後,執行計劃中extra部分會顯示"using mrr"緩存

-若是須要表進行全表掃描,innodb和myisam不使用mrr。
-索引能覆蓋的時候,mrr特性也用不上。
-Multi-Range Read(MRR) 能夠用於range、ref、eq_ref類型的查詢。優化

 

未開啓MRR以前:因爲MySQL存儲數據的方式: 輔助索引的存儲順序並不是與主鍵的順序一致,從圖中能夠看出,根據輔助索引獲取的主鍵來訪問表中的數據會致使隨機的IO。不一樣主鍵不在同一個page裏面時必然致使屢次IO和隨機讀。spa

 

使用MRR以後:code

 

開啓/關閉MRRblog

1
2
set optimizer_switch= 'mrr=on mrr_cost_based=on' ; #mrr_cost_based表示開啓mrr後,優化器是否根據cost來決定是否使用mrr
set oprimizer_switch= 'mrr=off' ;

默認是開啓MRR的。排序

 

對於MRR,參數read_rnd_buffer_size用來控制鍵值緩衝區的大小。索引

相關文章
相關標籤/搜索