1. 程式人生 > 資料庫 >MySQL InnoDB MRR優化指南

MySQL InnoDB MRR優化指南

前言

MRR 是 Multi-Range Read 的簡寫,目的是減少磁碟隨機訪問,將隨機訪問轉化為較為順序的訪問。適用於 range/ref/eq_ref 型別的查詢。

實現原理:

1、在二級索引查詢後,根據得到的主鍵到聚簇索引找出需要的資料。

2、二級索引查詢得到的主鍵的順序是不確定的,因為二級索引的順序與聚簇索引的順序不一定一致;

3、如果沒有 MRR,那麼在聚簇索引查詢時就可能出現亂序讀取資料頁,這對於機械硬碟是及其不友好的。

4、MRR 的優化方式:

  • 將查詢到的二級索引鍵值放在一個快取中;
  • 將快取中的鍵值按照 主鍵 進行排序;
  • 根據排序後的主鍵去聚簇索引訪問實際的資料檔案。

5、當優化器使用了 MRR 時,執行計劃的 Extra 列會出現 “Using MRR” 。

6、如果查詢使用的二級索引的順序本身與結果集的順序一致,那麼使用 MRR 後需要對得到的結果集進行排序。

使用 MRR 還可以減少緩衝池中頁被替換的次數,批量處理對鍵值的查詢操作。

可以使用命令 select @@optimizer_switch; 檢視是否開啟了 MRR:

index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=off,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on

mrr_cost_based=on 表示是否通過 cost based 的方式來選擇使用 MRR 。

set @@optimizer_switch='mrr=on/off'; 命令開啟或關閉 MRR 。

select @@read_rnd_buffer_size ; 引數用來控制鍵值的緩衝區大小,預設 256K,當大於該引數值時,執行器根據主鍵對已快取的資料進行排序,然後再通過主鍵取得行資料。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。