使用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
相关产品推荐
相关产品推荐

