对于很多初学者不明白MySQL到底是怎样执行关联查询的?下面作简要分析,高手就不用看了。
首先要明确下“关联”的含义,MySQL中的“关联”意义上比较广泛,MySQL认为任何一个查询都是一次“关联”,并不仅仅是一个查询需要到两个表的匹配才叫关联。
MySQL关联执行的策略
MySQL对任何关联操作都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有 表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。MySQL会尝试在最后一个关联表中找到所有匹配的行,如果最后一个关联表无法找到更多的行以 后,MySQL返回上一层关联表,看是否能够找到更多匹配的记录,依次类推迭代执行。
如果对上面的定义还不理解的请结合下面这个例子来看就清楚了:
SELECT a.c1, b.c2
FROM a INNER JOIN b USING(c3)
WHERE a.c1 IN (5,6);
以下伪码已经解释得很清楚了,其他查询也可以类似这样分析:
//$a_result: 表示根据in(5,6)条件先在a表中获取结果集
$outer_iterator = $a_result;
//获取第一条记录
$outer_row = $outer_iterator.next();
//进入while循环,读取b表中的数据
while $outer_row
//$b_result: 表示在b表中根据b.c3=$outer_row.c3条件获取的结果集
$inner_iterator = $b_result;
$inner_row = $inner_iterator.next();
while $inner_row
//开时输出结果
echo $outer_row.c1, $inner_row.c2
$inner_row = $inner_iterator.next()
end
$outer_row = $outer_iterator.next()
end