假设我在两个表中有大约25,000条记录,每条记录中的数据应该相同。如果我需要找到表A中但不在表B中的任何行,那么最有效的方法是什么。
我们已经尝试将其作为一个表的子查询和NOT IN
结果,但这会运行超过10分钟,几乎崩溃我们的网站。
必须有更好的方法。也许是JOIN
?
答案 0 :(得分:3)
希望LEFT OUTER JOIN
将完成这项工作
select t1.similar_ID
, case when t2.similar_ID is not null then 1 else 0 end as row_exists
from table1 t1
left outer join (select distinct similar_ID from table2) t2
on t1.similar_ID = t2.similar_ID // your WHERE goes here
答案 1 :(得分:2)
I would suggest you read the following blog post, which goes into great detail on this question:
哪种方法最好选择一个表中存在但缺少的值 在另一个?
经过深入分析后,得出以下结论:
但是,这三种方法[
NOT IN
,NOT EXISTS
,LEFT JOIN
] 生成三个不同的计划,由三个不同的执行 代码片段。执行EXISTS
谓词的代码约为30% 效率低于执行index_subquery
和LEFT JOIN
的效率低 优化使用Not exists
方法。这就是为什么在MySQL中搜索缺失值的最佳方法是使用
LEFT JOIN
/IS NULL
或NOT IN
而不是NOT EXISTS
。
如果您使用NOT IN
看到的效果不理想,则切换为LEFT JOIN
/ IS NULL
或NOT EXISTS
并不会改善此效果,相反,您需要采用不同的路线来优化此查询,例如添加索引。
答案 2 :(得分:0)
Select * from A where not exists(select * from B);
答案 3 :(得分:0)
左连接。来自the mysql documentation
如果ON或USING中的右表没有匹配的行 在LEFT JOIN中,使用所有列设置为NULL的行 合适的桌子。您可以使用此事实查找表中的行 在另一张表中没有对应物:
SELECT left_tbl。* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
此示例查找left_tbl中的所有行,其id值不是 出现在right_tbl中(也就是说,left_tbl中的所有行都没有 right_tbl中的相应行。