mysql中join的选择(mysql每日一讲)

                                                  关于join的问题

条件:

a表100行数据
b表100行数据
假如 a join b on a.字段1=b.字段2
此时驱动表是a表,被驱动表示b表

1、假如b表上字段2建立了索引
那么a表作为驱动表将会逐行扫描,扫描100次,b表上字段2有索引,因此a表每一行会读b表的一行,这样总扫描次数是100+100=200次
2、假如b表上的字段2没有建立索引
那么a表作为驱动表每一行扫描,b表上没有索引,因此会逐行扫描,a的每一行对应b上的100行,索引总扫描次数是 100*100=10000次
Block Nested-Loop Join算法 是在内存进行的
Simple Nested-Loop Join算法不是在内存

结论:当第1中情况时,小表作为驱动表复杂度好很多。
当2种情况,哪一个作为驱动表都一样。
使用join_buffer 如果内存中放不下,策略是分段放,这也是Block Nested-Loop 中block的由来。
join_buffer_size可以设置join的时候占用内存大小,默认256k
如果你的join语句很慢,就把join_buffer_size改大

能不能使用join语句?explain一下
1.如果可以使用Index Nested-Loop Join算法,也就是说可以用上被驱动表上的索引,其实是没问题的;
2.如果使用Block Nested-Loop Join算法,扫描行数就会过多。尤其是在大表上的join操作,这样可能要扫描被驱动表很多次,会占用大量的系统资源。所以这种join尽量不要用。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值