https://www.bilibili.com/video/BV14f421m7KE/?spm_id_from=333.337.search-card.all.click&vd_source=056e410fe25ea3fc8e58a29797025699

Untitled

小表驱动大表就是指用数据量较小、索引比较完备的表,然后使用其索引和条件对大表进行数据筛选,从而减少数据计算量,提高查询效率。比如说 student 表有 30 条数据,scores 表有 80w 条数据。

Untitled

Join Buffer (连接缓冲区)是优化器用于处理连接查询操作时的临时缓冲区。简单来说当我们需要比较两个或多个表的数据进行 Join 操作时,Join Buffer 可以帮助 MySQL 临时存储结果,以减少磁盘读取和 CPU 负担,提高查询效率。需要注意的是每个 join 都有一个单独的缓冲区。

Block nested-loop join(BNL 算法)会将驱动表数据加载到 join buffer 里面,然后再批量与非驱动表进行匹配;如果驱动表数据量较大,join buffer 无法一次性装载驱动表的结果集,将会分阶段与被驱动表进行批量数据匹配,会增加被驱动表的扫描次数,从而降低查询效率。所以开发要遵守小表驱动大表的原则。

Untitled

分阶段匹配过程如下: