【发布时间】:2011-01-14 17:58:08
【问题描述】:
this O'Reilly presentation中有一段介绍了理解MySQL的EXPLAIN的一些关键概念:
什么是联接?
- 一切都是JOIN,因为MySQL总是使用嵌套循环
- 即使是单表 SELECT 或 UNION 或子查询
谁能解释一下这对于单个表 SELECT 是如何工作的?
【问题讨论】:
this O'Reilly presentation中有一段介绍了理解MySQL的EXPLAIN的一些关键概念:
什么是联接?
- 一切都是JOIN,因为MySQL总是使用嵌套循环
- 即使是单表 SELECT 或 UNION 或子查询
谁能解释一下这对于单个表 SELECT 是如何工作的?
【问题讨论】:
嵌套循环是处理连接的一种方式:
for each row of table A
if this row matches where clauses
for each row of joined table B
if this row matches where clauses and join clauses
accept row
end
end
end
end
这可以通过索引进行相当多的优化,通过“针对在某个索引中的键 K 处找到的每一行”而不是“表 A 的每一行”,与表 B 相同。
演示文稿说这是 MySQL 处理连接的唯一方式。还有其他方法可以使用,但 MySQL 没有实现它们。这个 OraFAQ 条目给出了 Oracle 实现的几个:http://www.orafaq.com/tuningguide/join%20methods.html 同样:http://oracle-online-help.blogspot.com/2007/03/nested-loops-hash-join-and-sort-merge.html
“一切都是连接”只是一个实现细节,我相信。没那么重要。
【讨论】: