多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 基于块的嵌套循环连接(Block Nested-Loop Join) `join buffer`就是执行连接查询前申请的一块固定大小的内存,先把若干条驱动表结果集中的记录装在这个`join buffer`中,然后开始扫描被驱动表,每一条被驱动表的记录一次性和`join buffer`中的多条驱动表记录做匹配,因为匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的`I/O`代价。使用`join buffer`的过程如下图所示: ![](https://img.kancloud.cn/58/7a/587a1a45d24da2f3b2b6bf1c94c4dcbe_826x479.png) 最好的情况是`join buffer`足够大,能容纳驱动表结果集中的所有记录,这样只需要访问一次被驱动表就可以完成连接操作了。设计`MySQL`的大叔把这种加入了`join buffer`的嵌套循环连接算法称之为`基于块的嵌套连接`(Block Nested-Loop Join)算法。 这个`join buffer`的大小是可以通过启动参数或者系统变量`join_buffer_size`进行配置,默认大小为`262144字节`(也就是`256KB`),最小可以设置为`128字节`。当然,对于优化被驱动表的查询来说,最好是为被驱动表加上效率高的索引,如果实在不能使用索引,并且自己的机器的内存也比较大可以尝试调大`join_buffer_size`的值来对连接查询进行优化。 另外需要注意的是,驱动表的记录并不是所有列都会被放到`join buffer`中,只有查询列表中的列和过滤条件中的列才会被放到`join buffer`中,所以再次提醒我们,最好不要把`*`作为查询列表,只需要把我们关心的列放到查询列表就好了,这样还可以在`join buffer`中放置更多的记录呢哈。