MySQL InnoDB MRR優(yōu)化指南
前言
MRR 是 Multi-Range Read 的簡寫,目的是減少磁盤隨機(jī)訪問,將隨機(jī)訪問轉(zhuǎn)化為較為順序的訪問。適用于 range/ref/eq_ref 類型的查詢。
實(shí)現(xiàn)原理:
1、在二級索引查找后,根據(jù)得到的主鍵到聚簇索引找出需要的數(shù)據(jù)。
2、二級索引查找得到的主鍵的順序是不確定的,因?yàn)槎壦饕捻樞蚺c聚簇索引的順序不一定一致;
3、如果沒有 MRR,那么在聚簇索引查找時就可能出現(xiàn)亂序讀取數(shù)據(jù)頁,這對于機(jī)械硬盤是及其不友好的。
4、MRR 的優(yōu)化方式:
- 將查找到的二級索引鍵值放在一個緩存中;
- 將緩存中的鍵值按照 主鍵 進(jìn)行排序;
- 根據(jù)排序后的主鍵去聚簇索引訪問實(shí)際的數(shù)據(jù)文件。
5、當(dāng)優(yōu)化器使用了 MRR 時,執(zhí)行計(jì)劃的 Extra 列會出現(xiàn) “Using MRR” 。
6、如果查詢使用的二級索引的順序本身與結(jié)果集的順序一致,那么使用 MRR 后需要對得到的結(jié)果集進(jìn)行排序。
使用 MRR 還可以減少緩沖池中頁被替換的次數(shù),批量處理對鍵值的查詢操作。
可以使用命令 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'; 命令開啟或關(guān)閉 MRR 。
select @@read_rnd_buffer_size ; 參數(shù)用來控制鍵值的緩沖區(qū)大小,默認(rèn) 256K,當(dāng)大于該參數(shù)值時,執(zhí)行器根據(jù)主鍵對已緩存的數(shù)據(jù)進(jìn)行排序,然后再通過主鍵取得行數(shù)據(jù)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
MySQL 有關(guān)MHA搭建與切換的幾個錯誤log匯總
這篇文章主要介紹了MySQL 有關(guān)MHA搭建與切換的幾個錯誤log匯總,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2020-12-12
MySQL中g(shù)roup_concat函數(shù)深入理解
本文通過實(shí)例介紹了MySQL中的group_concat函數(shù)的使用方法,需要的朋友可以適當(dāng)參考下2012-11-11
查詢數(shù)據(jù)庫空間(mysql和oracle)
本文通過代碼示例詳細(xì)介紹了如何查詢MySQL數(shù)據(jù)空間和Oracle數(shù)據(jù)空間,具有一定的參考價值,感興趣的小伙伴可以參考閱讀2023-04-04
MySQL命令提示符出現(xiàn)輸入錯誤時如何修改前面的命令
本文主要介紹了MySQL命令提示符出現(xiàn)輸入錯誤時如何修改前面的命令,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
詳解Mysql中explain執(zhí)行計(jì)劃信息中字段
Extra是EXPLAIN輸出中另外一個很重要的列,該列顯示MySQL在查詢過程中的一些詳細(xì)信息,MySQL查詢優(yōu)化器執(zhí)行查詢的過程中對查詢計(jì)劃的重要補(bǔ)充信息,這篇文章主要介紹了Mysql中explain執(zhí)行計(jì)劃信息中字段詳解,需要的朋友可以參考下2023-08-08
Mysql報(bào)Table?'mysql.user'?doesn't?exist問題的解
這篇文章主要給大家介紹了關(guān)于Mysql報(bào)Table?'mysql.user'?doesn't?exist問題的解決方法,初學(xué)者可能會遇到這個問題,文中通過圖文將解決方法介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
oracle/mysql數(shù)據(jù)庫多條重復(fù)數(shù)據(jù)如何取最新的
最近開發(fā)的時候遇到一個任務(wù),需要對重復(fù)的數(shù)據(jù)進(jìn)行篩選,只取插入時間最早的一條數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于oracle/mysql數(shù)據(jù)庫多條重復(fù)數(shù)據(jù)如何取最新的相關(guān)資料,需要的朋友可以參考下2024-08-08

