SELECT
t1.column1,
t2.column2
FROM
tb1 t1
INNERJOIN tb2 t2 ON t1.column3 = t2.column3
WHERE
t1.column1 IN(4,6)
outer_iter = iterator over t1 WHERE column3 IN(4,6)
outer_row = outer_iter.next
WHILE outer_row
inner_iter = iterator over t2 WHERE column3 = outer_row.column3
inner_row = inner_iter.next
WHILE inner_row
output [ outer_row.column1,inner_row.column2 ]
inner_row = inner_iter.next
END
outer_row = outer_iter.next
END
假设mysql按照查询中表顺序进行关联操作,我们可以用伪代码标识这个过程。
我们用表格的形式来表示关联查询过程,从左到右
t1
t2
结果行
column1=4,column3=1
column3=1,column2=1
column1=4,column3=1
column3=1,column2=2
column1=4,column3=2
column3=1,column2=3
column1=4,column3=3
column1=6,column3=2
column3=2,column2=1
column1=6,column3=1
column3=2,column2=2
column1=6,column3=2
column3=2,column2=3
column1=6,column3=3
t1中匹配到的第一行,4和1, 接着会去关联表中查找关联数据,得到一二三条,第二台数据类似。
关联查询的优化:
EXPLAINselect*from QuestionAnswerContentDetailVerify q STRAIGHT_JOIN Questions a
ON q.questionID = a.questionID where a.questionType !=4