关于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尽量不要用。