mysql 5 7中的MBR和BKA演算法

2021-09-02 21:09:39 字數 2509 閱讀 6682

一、什麼是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 中,索引可以被隱藏和顯示,當乙個索引隱藏時,他不會被查詢優化器所使用 也就是說可以隱藏乙個索引,然後觀察對資料庫的影響.如果效能下降,就說明這個索...