mysql5.7基于块的嵌套循环连接(Block Nested-Loop Join)
select * from t_order t1,t_order_detail t2 where t1.id = t2.order_id and t1.amount > 100;
这里t1是驱动表,t2是被驱动表,当t1一行记录对应t2的3行记录时,t2表就需要循环3次,当t1表有N行记录时,t2表就需要循环 N*3次,这种性能是比较低的。
所以mysql就想出了嵌套循环连接的方法,为SQL开辟了一块内存,专门为t2表的一行记录重复使用多次,以匹配已经从t1表查询出来的值。
mysql中专门为join buffer设置了一个变量,单位是字节:
show variables like 'join_buffer_size'; -- 默认262144字节
262144 bytes
= 256 kb
= 0.25 mb
mysql执行的时候,join buffer只放驱动表,不放被驱动表。
end.