MySQL 认为任何一个查询都是一次“关联”,并不仅仅是一个查询需要到两个表匹配才叫关联,所以在 MySQL 中,每一个查询,每一个片段(包括子查询,甚至基于单表查询)都可以是一次关联。
当前 MySQL 关联执行的策略很简单: MySQL 对任何关联都执行嵌套循环关联操作,即 MySQL 先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。
例子:
查询语句:
1
SELECT tbl1.col1, tbl2.col2 FROM tbl1 INNERJOIN tbl2 USING(col3) WHERE tbl1.col1 IN (5, 6);
假设 MySQL 按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示 MySQL 将如何完成这个查询:
1 2 3 4 5 6 7 8 9 10 11
outer_iter = iterator over tbl1 where col1 in (5, 6) outer_row = outer_iter.next while outer_row inner_iter = iterator over tbl2 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 tbl1.col1, tbl2.col2 FROM tbl1 LEFTOUTERJOIN tbl2 USING(col3) WHERE tbl1.col1 IN (5, 6);
那么,对应的伪代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
outer_iter = iterator over tbl1 where col1 in (5, 6) outer_row = outer_iter.next while outer_row inner_iter = iterator over tbl2 where col3 = outer_row.col3 inner_row = inner_iter.next if inner_row while inner_row output [ outer_row.col1, inner_row.col2] inner_row = inner_iter.next end else output [ outer_row.col1, null] end outer_row = outer_iter.next end