1. 程式人生 > >MySQL 5.6新特性 -- Multi-Range Read

MySQL 5.6新特性 -- Multi-Range Read

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