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

3181c49b5e45776cd2a65b33ddcee8d7.png

使用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,目的是减少磁盘的随机访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值