MySQL中的嵌套循环

RAD*_*ADA 6 mysql sql-execution-plan

这篇O'Reilly演示文稿中,有一段介绍了理解MySQL的EXPLAIN的一些关键概念:

什么是加入?

  • 一切都是JOIN,因为MySQL总是使用嵌套循环
  • 甚至是单表SELECT或UNION或子查询

任何人都可以解释这对单表SELECT如何工作?

der*_*ert 4

嵌套循环是处理连接的一种方法:

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
Run Code Online (Sandbox Code Playgroud)

这可以通过索引进行相当多的优化,通过执行“针对某个索引中键 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-哈希连接和排序合并.html

我相信,“一切都是连接”只是一个实现细节。其实没那么重要。