2026-05/04~10技术问题处理一.LEFT JOIN 与 INNER JOIN1. 原始业务场景2. 原有错误 SQL3. 存在问题 根因4. 分步优化 每步原因5. 最终正确 SQL6. 配套索引7. 二次拓展一.LEFT JOIN 与 INNER JOIN1. 原始业务场景左连接:以左表为主表,保留主表所有数据,根据连接条件匹配右表数据,匹配成功直接回显,匹配失败即为null.内连接: 保留符合连接条件的数据。2. 原有错误 SQLSELECTCOUNT(task.id)FROMpro_inspect_await_instance_task taskLEFTJOINpro_inspect_product_submit submitONtask.product_submit_idsubmit.idWHEREsubmit.status103. 存在问题 根因逻辑错误LEFT JOIN 左连接后WHERE submit.status 10 会把 submit为NULL 的数据全部过滤左连接变相变成内连接等价于内连接计数冗余COUNT(task.id) 主键非空和 COUNT() 效果一致但优化器对 COUNT() 优化更好无索引关联字段、过滤字段无索引大表全表扫描性能差。4. 分步优化 每步原因把 submit 过滤条件从 WHERE 移到 JOIN 的 ON 后面原因ON 后过滤只过滤关联匹配的数据不会删掉主表 task 不匹配的数据保留左连接语义COUNT(task.id) 改为 COUNT(*)原因主键非空语义等价数据库优化器处理更高效给关联字段、状态字段建立联合索引原因避免全表扫描走索引快速过滤 关联。5. 最终正确 SQL-- 保留主表所有数据仅关联内过滤状态SELECTCOUNT(*)FROMpro_inspect_await_instance_task taskLEFTJOINpro_inspect_product_submit submitONtask.product_submit_idsubmit.idANDsubmit.status10;-- 条件放ON里6. 配套索引CREATEINDEXidx_submit_status_idONpro_inspect_product_submit(status,id);CREATEINDEXidx_task_submit_idONpro_inspect_await_instance_task(product_submit_id);7. 二次拓展若业务本来就只需要两表都匹配数据直接改用 INNER JOIN 更直观大表可改用 EXISTS 半连接优化。