原理: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
開啓/關閉MRR:blog
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用來控制鍵值緩衝區的大小。索引