1. 程式人生 > >Block Nested-Loop 和 Batched Key Access

Block Nested-Loop 和 Batched Key Access

關聯 extra spa pla key 如果 過程 算法 man

官方文檔:https://dev.mysql.com/doc/refman/5.7/en/bnl-bka-optimization.html

BNL和BKA是MySQL 表關聯的兩種關聯算法

比如t1、t2、t3關聯查詢且查詢順序和關聯順序一致,MySQL處理join的過程一般是

t1和t2的關聯的結果集放入join buffer B1,分配到join buffer時,varchar類型字段的長度是最小的分配單元,所以varchar也指定合適長度,以免浪費內存。

B1中的結果集再和t3進行匹配,將匹配的結果集放入join buffer B2,B2是增量的buffer,因為B2中存放的是t3匹配的column和與之匹配的row的位置鏈接

當內表的查詢類型是all、index或range的時候才會走BNL,explain輸出的extra是Using join buffer (Block Nested Loop)

BAK和BNL的別在於所有的右表和左結果集匹配時走輔助索引。BAK會一次性提交B1中與t2關聯的column到Multi-Range Read (MRR)接口與t2的索引進行

匹配,然後通過MRR返回匹配的按主鍵排序的key,從而減少回表時產生的隨機I/O。join_buffer_size的大小決定BAK每次批處理提交給MRR的key的大小,

適當增大join_buffer_size 的大小可以有效的提高關聯查詢的性能。

內表的查詢類型是ref或eq_ref時join會采用BAK,explain的extra輸出為Using join buffer (Batched Key Access)

BNL默認開啟,而BKA默認時關閉的,如果要開啟BAK,需要一起開始MRR

mysql> SET optimizer_switch=mrr=on,mrr_cost_based=off,batched_key_access=on;

Block Nested-Loop 和 Batched Key Access