一、什麼是mrr
mmr全稱是multi-range read,是mysql5.6優化器的乙個新特性,在mariadb5.5也有這個特性。優化的功能在使用二級索引做範圍掃瞄的過程中減少磁碟隨機io和減少主鍵索引的訪問次數。將隨機io轉換為順序io
二、mrr和沒有mrr的區別
給出乙個簡單的例子,在innodb表執行下面的查詢:
select non_key_column from tbl where key_column=x
在沒有mrr的情況下,它是這樣得到結果的:
1. select key_column, pk_column from tb where key_column=x order by key_column ---> 假設這個結果集是t
2. for each row in t ; select non_key_column from tb where pk_column = pk_column_value。(在oracle裡第2步叫回表)
在有mrr的情況下,它是這樣執行的:
1. select key_column, pk_column from tb where key_column = x order by key_column ---> 假設這個結果集是t
2. 將結果集t放在buffer裡面(直到buffer滿了),然後對結果集t按照pk_column排序 ---> 假設排序好的結果集是t_sort
3. select non_key_column fromtb where pk_column in (select pk_column from t_sort)
兩者的區別主要是兩點:
1. 沒有mrr的情況下,隨機io增加,因為從二級索引裡面得到的索引元組是有序,但是他們在主鍵索引裡面卻是無序的,所以每次去主鍵索引裡面得到non_key_column的時候都是隨機io。(如果索引覆蓋,那也就沒必要利用mrr的特性了,直接從索引裡面得到所有資料)
2. 沒有mrr的情況下,訪問主鍵索引的次數增加。沒有mrr的情況下,二級索引裡面得到多少行,那麼就要去訪問多少次主鍵索引(也不能完全這樣說,因為mysql實現了bnl),而有了mrr的時候,次數就大約減少為之前次數t/buffer_size。
二 bka
batched key access (bka) 提高表join效能的演算法。當被join的表能夠使用索引時,就先排好順序,然後再去檢索被join的表,聽起來和mrr類似,實際上mrr也可以想象成二級索引和 primary key的join
如果被join的表上沒有索引,則使用老版本的bnl策略(block nested-loop)
bka原理
對於多表join語句,當mysql使用索引訪問第二個join表的時候,使用乙個join buffer來收集第乙個操作物件生成的相關列值。bka構建好key後,批量傳給引擎層做索引查詢。key是通過mrr介面提交給引擎的(mrr目的是較為順序)mrr使得查詢更有效率。
大致的過程如下:
bka使用join buffer儲存由join的第乙個操作產生的符合條件的資料
然後bka演算法構建key來訪問被連線的表,並批量使用mrr介面提交keys到資料庫儲存引擎去查詢查詢。
提交keys之後,mrr使用最佳的方式來獲取行並反饋給bka
bnl和bka都是批量的提交一部分行給被join的表,從而減少訪問的次數,那麼它們有什麼區別呢?
bnl比bka出現的早,bka直到5.6才出現,而nbl至少在5.1裡面就存在。
bnl主要用於當被join的表上無索引
bka主要是指在被join表上有索引可以利用,那麼就在行提交給被join的表之前,對這些行按照索引字段進行排序,因此減少了隨機io,排序這才是兩者最大的區別,但是如果被join的表沒用索引呢?那就使用nbl
bka和bnl標識
using join buffer (batched key access)和using join buffer (block nested loop)
相關引數
bak使用了mrr,要想使用bak必須開啟mrr功能,而mrr基於mrr_cost_based的成本估算並不能保證總是使用mrr,官方推薦設定mrr_cost_based=off來總是開啟mrr功能。開啟bak功能(bak預設off):
set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
複製**
bka使用join buffer size來確定buffer的大小,buffer越大,訪問被join的表/內部表就越順序。
set optimizer_switch=』block_nested_loop』
複製**
支援inner join, outer join, semi-join operations,including nested outer joins
bka主要適用於join的表上有索引可利用,無索引只能使用bnl
三 設定
set global optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
mysql57是什麼 關於mysql57的詳細介紹
簡介 php7 mysql57 nginx19 on ubuntu 1404 本文 前段時間php公升級到了7.0版本,據說很牛叉,比如效能較5.6提公升兩倍,記憶體占用低之類的,後來又看微博上說等到7.0.1才穩定。果不其然,很快就公升級了,最近才有時間折騰一下,在這裡做個總結。環境 1核1g主機...
Mysql5 7安裝和配置
2 配置環境變數 我的電腦 屬性 高階 環境變數 path 如 d program files mysql mysql server 5.7 bin 注意是追加,不要覆蓋 3 修改my default.ini 僅僅修改不行的,需要複製乙份,叫my.ini 在其中修改或新增配置 mysqld base...
Mysql8 和mysql 5 7 的區別
mysql從5.7 版本提供了nosql的儲存功能,在8.0中這部分得到一些修改,不過這個在實際中用的極少 隱藏索引的特性對於效能除錯非常有用,在8.0 中,索引可以被隱藏和顯示,當乙個索引隱藏時,他不會被查詢優化器所使用 也就是說可以隱藏乙個索引,然後觀察對資料庫的影響.如果效能下降,就說明這個索...