1. 程式人生 > 實用技巧 >MySQL中的BNL優化器

MySQL中的BNL優化器

在5.7以上版本中,BNL優化器預設是開啟的,

show variables like 'optimizer_switch' 

optimizer_switch 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=on,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,hash_join=on

使用BNL可以較為明顯的降低訪問內表的次數,同時也降低迴表的IO次數,以此來達到優化的目的。

只有當join型別是all/index/range時才可以,也就是內表不使用索引或者索引效率很低時才不得已使用。

buffer的大小由join_buffer_size進行設定,buffer中儲存著參與連線的所有資訊,join完成後buffer釋放。

對於使用到BNL特性且效能較差的SQL,建議在session級別將Join_buffer_size臨時增大來提高效能。

表的join操作通常是通過效率較高的索引來做ref或者eq_ref方式連線,這種情況下,BNL是無法使用的。

對更為常見的join操作,MySQL引入了MRR和BKA,目的是減少磁碟的隨機訪問。