【问题标题】:Nested loops in MySQLMySQL中的嵌套循环
【发布时间】:2011-01-14 17:58:08
【问题描述】:

this O'Reilly presentation中有一段介绍了理解MySQL的EXPLAIN的一些关键概念:

什么是联接?

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

谁能解释一下这对于单个表 SELECT 是如何工作的?

【问题讨论】:

    标签: mysql sql-execution-plan


    【解决方案1】:

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

    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

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

    【讨论】:

    • 我询问了 MySQL 上的 SINGLE TABLE 选择,因此您的答案不适用。你可能认为它“不是那么重要”,但我确实如此。我仍然希望我的问题得到解答。
    • @RADA:我不确定 MySQL 如何将单表选择转换为连接。也许它将它连接到一个有一行的虚拟表,或者左连接到一个零行的虚拟表?我想 MySQL 源代码肯定会说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2012-05-05
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多