MySQL 使用联合的形式的地方会远远超过我们过去认知的范畴。基本上,它会认为每个查询都有联合,而不仅仅是从两张表中查出匹配的数据行,这包括了子查询,甚至仅仅对单表的 SELECT 操作。因此,理解 MySQL 如何执行联合十分重要。
MySQL 联合查询执行策略。
以一个 UNION 查询为例,MySQL 执行 UNION 查询时,会把他们当做一系列的单个查询语句,然后把对应的结果放入到临时表中,最终再读出来返回。在 MySQL中,每个独立的查询都是一个联合查询,从临时表读取返回结果也一样。
这种情形下,MySQL 的联合查询执行很简单——它将这里的联合查询当做是嵌套循环的联合查询。这意味着 MySQL 会运行一个循环去从数据表读取数据行,然而在运行一个嵌套循环从下一个表读取匹配的数据行。这个过程一直持续,直到找到联合查询中的所有匹配的数据行。然后再根据 SELECT 语句中需要的列去构建返回结果。如下面的查询语句所示:
SELECT tb1.col1, tb2.col2
FROM tb1 INNER JOIN tb2 USING(col3)
WHERE tb1.col1 IN(5,6);
实际转换为 MySQL可能执行的伪代码是下面这样的:
outer_iter = iterator over tb1 where col1 IN(5,6);
outer_row = outer_iter.next;
while outer_row
inner_iter = iterator over tb2 where col3 = outer_row.col3;
inner_row = inner_iter.next
while inner_row
output [outer_row.col1, inner_row.col2];
inner_row = inner_iter.next;
end
outer_row = outer.iter.next;
end
这个查询执行计划像处理单表查询一样那样简单地处理多表查询,这就是为什么说即便是单表查询也可以当做联合查询——单表联合查询是更复杂的组合联合查询的基本操作。对于外连接的处理也是一样,例如下面的查询:
SELECT tb1.col1, tb2.col2
FROM tb1 LEFT OUTER JOIN tb2 USING(col3)
WHERE tb1.col1