5.6新特性之NL,BNL,MRR和BKA
NLJ(nested-loop join):
從第一個表每次讀一行資料,傳遞到一個巢狀迴圈(處理join中的下一個表)。
這個處理重複次數跟join中涉及的表相同?
例子:
Table Join Type
t1 range
t2 ref
t3 ALL
邏輯處理:
for each row in t1 matching range {
for each row in t2 matching reference key {
for each row in t3 {
if row satisfies join conditions,
send to client
}
}
}
BNL(Block Nested-Loop Join):
通過快取外層迴圈讀的行,來降低內層表的讀取次數。比如: 10行資料讀入到buffer中,
然後buffer被傳遞到內層迴圈,內層表讀出的每一行都要跟這個快取的10行依次做對比,
這樣就降低了內層表資料的讀取次數。
使用條件:
1] join_buffer_size決定了每一個join buffer的大小
2] 只有當join type是 all or index(沒有合適的索引,使用全索引或者全表掃描的場景),
range的時候才會使用。5.6中,外連線也可以用buffer了。
3] 每一個需要buffer的join都會申請一個獨立的buffer,也就是說一個查詢可能使用多個join buffer。
4] 第一個非常量表是不會使用join buffer的。
5] join buffer在執行join之前申請,在查詢完成後釋放。
6] join buffer只儲存跟join有關的列,而不是整行
explain 列顯示:Using join buffer (Block Nested Loop)
邏輯處理:
for each row in t1 matching range {
for each row in t2 matching reference key {
store used columns from t1, t2 in join buffer
if buffer is full {
for each row in t3 {
for each t1, t2 combination in join buffer {
if row satisfies join conditions,
send to client
}
}
empty buffer
}
}
}
if buffer is not empty {
for each row in t3 {
for each t1, t2 combination in join buffer {
if row satisfies join conditions,
send to client
}
}
}
MRR(Multi-Range Read):
當一個表很大,不能儲存到儲存引擎的快取的時候,使用二級索引做範圍掃描會引起大量磁碟隨機讀。
MRR的存在就是為了優化這些隨機讀。mysql開始只掃描跟行相關的索引和收集key,然後把這些key排序,
最後根據排好序的primary key來從基礎表獲取資料。 MRR的目的是,降低隨機的磁碟IO,替換成相對更
有順序的IO。
MRR的好處:
1、隨機IO轉換成順序IO。
2、批量處理請求
優化場景:
A: MRR可以用來做innodb,myiasm的索引範圍掃描和等值join操作。
1、索引元組累積到一個buffer
2、buffer中的元組根據rowid排序
3、根據排序好的索引元組順序去獲取資料行
4、當不需要回表訪問的時候,MRR就失去意義了(比如覆蓋索引)
當使用MRR的時候 explain出現:Using MRR標誌
儲存引擎使用read_rnd_buffer_size 的值來確定MRR時的buffer大小。
BKA(Batched Key Access):
當使用索引訪問第二個join物件的時候,跟BNL類似,BKA使用一個join buffer
來收集第一個操作物件生成的相關列值。BKA構建好key後,批量傳給引擎層做索引
查詢。key是通過MRR介面提交給引擎的,這樣,MRR使得查詢更有效率。
BKA使用join buffer size來確定buffer的大小,buffer越大,訪問右側表就越
順序。
使用BAK的條件:
SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20625855/viewspace-1456701/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 學習MYSQL之ICP、MRR、BKAMySql
- 從順序隨機I/O原理來討論MYSQL MRR NLJ BNL BKA隨機MySql
- MySQL中的Join 的演算法(NLJ、BNL、BKA)MySql演算法
- 【MySQL】MySQL5.6新特性之Batched Key AccessMySqlBAT
- 【MySQL】MySQL5.6新特性之crash-safeMySql
- MySQL5.6新特性之Multi-Range ReadMySql
- 【MySQL】MySQL5.6新特性之Multi-Range ReadMySql
- mysql5.6複製新特性MySql
- MySQL 5.6的72個新特性(譯)MySql
- MySQL5.6 GTID新特性實踐MySql
- MySQL MRR和ICP介紹MySql
- MySQL5.6版本的新特性介紹MySql
- mysql5.6新特性GTID基本原理MySql
- MySQL 5.6, 5.7, 8.0版本的新特性彙總大全MySql
- 10G新特性筆記之安裝新特性筆記
- mySQL5.6新特性快速預熱Buffer_Pool緩衝池MySql
- 【MySQL】5.7新特性之四MySql
- 【MySQL】5.7新特性之五MySql
- 【MySQL】5.7新特性之六MySql
- 【MySQL】5.7新特性之七MySql
- C++ 11 新特性之容器相關特性C++
- 10G新特性筆記之備份恢復新特性筆記
- Oracle 10g R2新特性之備份和可用性特性Oracle 10g
- JDK8新特性之stream()JDK
- HTML5 新特性之 WebsocketHTMLWeb
- Java8新特性之:OptionalJava
- Java 8 新特性之方法引用Java
- ES6 新特性之SymbolSymbol
- MySQL 8 新特性之Clone PluginMySqlPlugin
- Java 10 新特性之 AppCDSJavaAPP
- C++11 新特性之 lambdaC++
- C++ 11 新特性之ClassC++
- IOS11新特性之maskedCornersiOS
- Oracle 12c新特性之Sequence的Session特性OracleSession
- java8的新特性之lambda表示式和方法引用Java
- PHP 5.3、5.4、5.5、5.6 中的新特性(7出來但是一樣有用)PHP
- Laravel 5.8 新特性和新變化 — 影片Laravel
- 【MySQL】MySQL效能優化之Block Nested-Loop Join(BNL)MySql優化BloCOOP