INNER JOIN 在连接行数远小于左表时更快因能利用索引和剪枝LEFT JOIN 必须扫描左表全部数据且右表条件误放 WHERE 会丢失未匹配行。INNER JOIN 什么时候比 LEFT JOIN 快不是语法写得“看起来少”就快关键看优化器能不能用上索引 是否能提前剪枝。INNER JOIN 在满足连接条件的行数远小于左表时通常能利用 index nested-loop join 或哈希连接快速收敛而 LEFT JOIN 即使右表没匹配项也必须扫完左表全部数据——哪怕你只 SELECT id优化器也不敢跳过左表的未匹配行。常见错误现象EXPLAIN 显示 typeALL 且 rows 高但加了 WHERE right_table.id IS NOT NULL 后反而变慢——这是强行把 LEFT JOIN 当 INNER JOIN 用却没让优化器重选执行计划实操建议先确认业务是否真需要保留左表无匹配的记录如果只是想“过滤出有关系的数据”直接用 INNER JOIN别加 IS NOT NULL 补丁参数差异join_buffer_size 对 INNER JOIN 的哈希连接影响大但对 LEFT JOIN 的驱动表扫描几乎无用LEFT JOIN 右表字段为 NULL 时为什么 WHERE 条件放错位置会丢数据因为 WHERE 是在连接完成之后过滤而 ON 是在连接过程中决定如何匹配。把本该写在 ON 的右表条件挪到 WHERE等于把 LEFT JOIN “降级”成 INNER JOIN——MySQL/PostgreSQL 都一样。常见错误现象写 LEFT JOIN orders ON users.id orders.user_id WHERE orders.status paid结果没订单的用户全没了实操建议右表的过滤条件只要涉及“是否参与连接逻辑”一律塞进 ON只有真正要全局过滤最终结果的比如 users.created_at 2024-01-01才放 WHERE示例对比LEFT JOIN orders ON users.id orders.user_id AND orders.status paid ?LEFT JOIN orders ON users.id orders.user_id WHERE orders.status paid ?JOIN 太多导致执行计划崩掉是加索引还是拆查询当 EXPLAIN 显示 Extra 列出现 Using temporary; Using filesort 或连接顺序明显反直觉比如拿 100 万行的表当驱动表说明成本模型已经失准——这时加索引往往无效因为优化器根本没机会用上。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。