MySQL中NestedLoopJoin如何确定驱动表,优化器选择逻辑是怎样的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计933个文字,预计阅读时间需要4分钟。
很多人以为 `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 的左表仍必须驱动)。
本文共计933个文字,预计阅读时间需要4分钟。
很多人以为 `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 的左表仍必须驱动)。

