在MySQL中,只有一种Join算法,就是大名鼎鼎的NestedLoop Join
对左表进行遍历,拿一条数据和右表的每条数据进行比对,如果找到N条匹配的,此条左表记录分别和这N条右表记录组合为N条记录,放到结果集合中,如果还有第三个表参与Join,则把前两个表的Join结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复
示例
有3个表:
user_group 用户组
group_message 组消息
group_message_content 消息内容
想要取得某个用户所在组的信息列表,执行下面的查询:
SELECT m.subject msg_subject, c.content msg_content
from user_group g,group_message m,group_message_content c
WHERE g.user_id = 1 and m.group_id = g.group_id and c.group_msg_id = m.id
这个查询过程会有3步:
(1)在user_group表中查找user_id = 1的记录
(2)以user_group表过滤出来的结果集中的group_id字段作为查询条件,对group_message循环查询
(3)通过将user_group和group_message这两个表的结果集中的group_message的id作为条件,与group_message_content的group_msg_id比较进行循环查询
因为上面的每一步都有索引可以用,所以非常快,假如去掉group_message_content表中group_msg_id字段的索引
第3步会变成全表扫描group_message_content,逐一比较每行group_msg_id字段值,同时会使用 join buffer,来尽量让查询速度快一点
所以在连接查询中正确设定索引是非常重要的