- • 先查驱动表:按 WHERE 筛选条件拿到一波数据
- • 对这波数据逐条循环:按 ON 连接条件 + WHERE 筛选条件查被驱动表
- • 每轮查到的数据与当前行关联,进入结果集
- • 三表关联:10 → 10 次查询得 30 条 → 再查 30 次,层层放大
- • 任何一层全表扫描都会被循环次数放大成灾难
- • 内连接:两边都关联得上才返回(WHERE 里写连接条件)
- • 左外连接:左表关联不上也返回,右边补 NULL(ON 子句)
- • 右外连接:右表关联不上也返回,左边补 NULL
- • 典型场景:零业绩员工也要出现在报表里
- • 外连接的连接条件语法上一般放在 ON 子句
- • 驱动表的 WHERE 筛选条件:必须有索引可用
- • 被驱动表的连接列:必须建索引,否则循环放大全表扫描
- • 看到 Using join buffer (Block Nested Loop) = 连接列缺索引的信号
- • 理想形态:被驱动表 type 是 eq_ref 或 ref
- • 更进一步:能单表查就不要关联(见④ 规则优化页最佳实践)