You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LEFT JOIN ON ident_key=null能否提升查询速度?无代码修正表合并逻辑问询

关于LEFT JOIN table ON ident_key = null的性能问题及你的场景解决方案

首先直接给结论:这种写法不仅不会提升查询速度,反而完全是无效操作,甚至可能拖慢查询。

为什么ON ident_key = null没用?

在SQL逻辑里,NULL和任何值(包括另一个NULL)用=比较的结果都是UNKNOWN,而JOIN的匹配条件只有结果为TRUE时才会关联行。所以LEFT JOIN table ON ident_key = null本质上和LEFT JOIN table ON 1=0完全一样——永远不会匹配到任何行,最终LEFT JOIN过来的表所有列都是NULL。这种情况下,数据库优化器还要额外处理这个无用的JOIN操作,反而增加了不必要的开销,完全没有性能提升的可能。

结合你的表结构,正确的写法应该是怎样的?

从你的描述来看,你应该是要找出A/B中还没同步到C的记录,毕竟A、B的记录要合并到C。这里给你针对不同需求的正确写法:

1. 找出A中未同步到C的记录

SELECT A.id_a, A.prop, A.val
FROM A
LEFT JOIN C 
  ON A.id_a = C.original_id 
  AND C.source_table = 'A' -- 必须指定来源表,避免和B的id混淆
WHERE C.id_c IS NULL; -- 过滤出C中没有匹配的A记录

2. 找出B中未同步到C的记录

SELECT B.id_b, B.prop, B.val
FROM B
LEFT JOIN C 
  ON B.id_b = C.original_id 
  AND C.source_table = 'B'
WHERE C.id_c IS NULL;

3. 合并查询A和B的未同步记录

如果需要一次性获取A、B中所有未同步到C的数据,可以用UNION ALL(比UNION高效,因为不需要去重):

SELECT 
  'A' AS source_table,
  A.id_a AS original_id,
  A.prop,
  A.val
FROM A
LEFT JOIN C 
  ON A.id_a = C.original_id 
  AND C.source_table = 'A'
WHERE C.id_c IS NULL

UNION ALL

SELECT 
  'B' AS source_table,
  B.id_b AS original_id,
  B.prop,
  B.val
FROM B
LEFT JOIN C 
  ON B.id_b = C.original_id 
  AND C.source_table = 'B'
WHERE C.id_c IS NULL;

如何真正提升这类查询的速度?

如果要优化上述查询的性能,最有效的方式是给C表建立合适的联合索引:

CREATE INDEX idx_c_original_source ON C(original_id, source_table);

这个索引可以让数据库快速定位到C中匹配某个original_id和source_table的记录,大幅减少JOIN时的查找时间。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:26:23