MySQL中NestedLoopJoin如何确定驱动表,优化器选择逻辑是怎样的?

2026-05-07 12:240阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计933个文字,预计阅读时间需要4分钟。

MySQL中NestedLoopJoin如何确定驱动表,优化器选择逻辑是怎样的?

很多人以为 `FROM t1 JOIN t2` 就意味着 `t1` 是驱动表。这是错误的。MySQL 优化器会基于统计信息(如行数、索引选择性、WHERE 条件过滤率)来估算各表的访问成本,并选择扫描行数更少、可用高效索引的表作为驱动表。因此,直接写出 `t1 JOIN t2`,若 `t2` 有强大的 WHERE 条件并覆盖索引,优化器很可能将其作为驱动表。

验证方法:执行 EXPLAIN FORMAT=TREE,看输出中哪个表出现在最外层嵌套的 Nested loop join 下方;或用 EXPLAIN FORMAT=JSON"join_order" 字段。

为什么 STRAIGHT_JOIN 能强制指定驱动表

STRAIGHT_JOIN 是唯一能绕过优化器、人工锁定驱动表顺序的手段。它要求优化器严格按 SQL 中表出现的顺序执行联接,且只对 JOIN 左右两侧生效(LEFT JOIN 的左表仍必须驱动)。

阅读全文
标签:Mysql

本文共计933个文字,预计阅读时间需要4分钟。

MySQL中NestedLoopJoin如何确定驱动表,优化器选择逻辑是怎样的?

很多人以为 `FROM t1 JOIN t2` 就意味着 `t1` 是驱动表。这是错误的。MySQL 优化器会基于统计信息(如行数、索引选择性、WHERE 条件过滤率)来估算各表的访问成本,并选择扫描行数更少、可用高效索引的表作为驱动表。因此,直接写出 `t1 JOIN t2`,若 `t2` 有强大的 WHERE 条件并覆盖索引,优化器很可能将其作为驱动表。

验证方法:执行 EXPLAIN FORMAT=TREE,看输出中哪个表出现在最外层嵌套的 Nested loop join 下方;或用 EXPLAIN FORMAT=JSON"join_order" 字段。

为什么 STRAIGHT_JOIN 能强制指定驱动表

STRAIGHT_JOIN 是唯一能绕过优化器、人工锁定驱动表顺序的手段。它要求优化器严格按 SQL 中表出现的顺序执行联接,且只对 JOIN 左右两侧生效(LEFT JOIN 的左表仍必须驱动)。

阅读全文
标签:Mysql