常听说 MySQL 中三表 JOIN 的执行流程并不是前两张表 JOIN 得出结果,再与第三张表进行 JOIN;而是三表嵌套的循环连接。
作者:胡呈清,爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:[简书 | 轻松的鱼],欢迎讨论。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文共 2000 字,预计阅读需要 8 分钟。
那这个三表嵌套的循环连接具体又是个什么流程呢?与前两张表 JOIN 得出结果再与第三张表进行 JOIN 的执行效率相比如何呢?下面通过一个例子来分析分析。
前提
关联字段无索引的情况下强制使用索引嵌套循环连接算法,目的是更好的观察扫描行数。
set optimizer_switch='block_nested_loop=off';
表结构和数据如下:
CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB;
drop procedure idata;
delimiter ;;
create procedure idata()
begin
declare i int;
set i=1;
while(i