1

假设我在两个表中有大约 25,000 条记录,每个表中的数据应该相同。如果我需要查找表 A 中但不在表 B 中的任何行,那么最有效的方法是什么。

我们已经尝试将其作为一个表的子查询和NOT IN结果,但这运行了 10 多分钟,几乎使我们的网站崩溃。

一定会有更好的办法。也许一个JOIN

4

4 回答 4

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
于 2013-08-01T17:29:39.297 回答
2

我建议您阅读以下博客文章,其中详细介绍了这个问题

哪种方法最好选择一个表中存在但在另一个表中缺失的值?

并经过深入分析,得出以下结论:

但是,这三种方法 [ NOT IN, NOT EXISTS, LEFT JOIN] 生成了三个不同的计划,由三段不同的代码执行。执行谓词的代码EXISTS比执行index_subqueryLEFT JOIN 优化使用Not exists方法的代码效率低约 30%。

这就是为什么在 MySQL 中搜索缺失值的最佳方法是使用LEFT JOIN/IS NULLNOT IN而不是NOT EXISTS.

如果您看到的性能NOT IN不令人满意,您不会通过切换到LEFT JOIN/IS NULL或来提高此性能NOT EXISTS,而是需要采取不同的途径来优化此查询,例如添加索引

于 2013-08-01T17:27:33.540 回答
0

改用exixts 和 not exists函数

Select * from A where not exists(select * from B);
于 2013-08-01T17:23:58.920 回答
0

左加入。来自mysql 文档

如果在 LEFT JOIN 的 ON 或 USING 部分中没有与右表匹配的行,则将所有列都设置为 NULL 的行用于右表。您可以使用此事实来查找表中的行,而这些行在另一个表中没有对应项:

SELECT left_tbl.* FROM left_tbl LE​​FT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id 为 NULL;

此示例在 left_tbl 中查找 id 值在 right_tbl 中不存在的所有行(即,left_tbl 中的所有行,而 right_tbl 中没有对应的行)。

于 2013-08-01T17:27:43.657 回答