MySQL 5.6新特性 -- Multi-Range Read
阿新 • • 發佈:2017-11-06
mysql存儲 mys highlight 存儲 optimizer light 一個 計劃 優化器
如果基表很大,數據沒有被緩存,在二級索引上使用範圍掃描讀取行可能會導致大量的隨機磁盤訪問。使用Multi-Range Read新特性,mysql可以減少對磁盤的隨機讀的次數:首先,mysql只是掃描索引,收集相關行的keys;然後,將收集到的keys進行排序;最後通過有序的主鍵去訪問基表。
Multi-Range Read特性的目的就是減少對磁盤的隨機訪問,進而對基表執行更多的順序掃描。
使用MRR後,執行計劃中extra部分會顯示"using mrr"
-如果需要表進行全表掃描,innodb和myisam不使用mrr。
-索引能覆蓋的時候,mrr特性也用不上。
-Multi-Range Read(MRR) 可以用於range、ref、eq_ref類型的查詢。
未開啟MRR之前:由於MySQL存儲數據的方式: 輔助索引的存儲順序並非與主鍵的順序一致,從圖中可以看出,根據輔助索引獲取的主鍵來訪問表中的數據會導致隨機的IO。不同主鍵不在同一個page裏面時必然導致多次IO和隨機讀。
使用MRR之後:
開啟/關閉MRR:
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用來控制鍵值緩沖區的大小。
MySQL 5.6新特性 -- Multi-Range Read