LEFT JOIN优化

2025-03-11  本文已影响0人  盼旺

在 SQL 中,若要在 LEFT JOIN 时先筛选左表,再筛选右表,最后关联,最优写法是 将左表的筛选放在子查询中,右表的筛选放在 ON 条件里。这样能减少关联时的数据量,提升性能。

示例场景

假设有两个表:

用户表 users:存储用户信息。
订单表 orders:存储订单信息,通过 user_id 关联用户。
需求
查询 2023 年注册的用户 及其 已完成的订单,要求:

先筛选左表 users(注册时间在 2023 年)。
再筛选右表 orders(订单状态为已完成)。
最后关联两张表。

最优 SQL 写法

SELECT
    u.user_id,
    u.name,
    o.order_id,
    o.amount
FROM
    (SELECT * FROM users WHERE register_year = 2023) u  -- 先筛选左表
LEFT JOIN
    orders o
ON
    u.user_id = o.user_id
    AND o.status = 'completed';  -- 再筛选右表并关联

1.左表筛选:
通过子查询 (SELECT * FROM users WHERE register_year = 2023) u 先过滤左表数据,减少参与 JOIN 的数据量。
如果左表数据量很大,这一步能显著降低计算复杂度。
2.右表筛选:
在 ON 条件中指定 o.status = 'completed',确保只关联符合条件的右表记录。
注意:不要将右表筛选放在 WHERE 中,否则会隐式将 LEFT JOIN 转换为 INNER JOIN(因为 WHERE 会过滤掉右表为 NULL 的行)。
3.执行顺序:
先执行子查询过滤左表,再执行 LEFT JOIN 并过滤右表,最后关联结果。

上一篇 下一篇

猜你喜欢

热点阅读