用于查找一个表中的行而不是另一个表中的行的MySQL查询

用于查找一个表中的行而不是另一个表中的行的MySQL查询,mysql,join,Mysql,Join,假设我在两个表中有大约25000条记录,每个表中的数据应该是相同的。如果我需要查找表A中但不在表B中的任何行,那么最有效的方法是什么 我们尝试将其作为一个表的子查询,结果中没有出现,但它运行了10分钟,几乎使我们的网站崩溃 一定有更好的办法。可能是一个连接?使用函数 Select * from A where not exists(select * from B); 改用函数 Select * from A where not exists(select * from B); : 哪种方法最

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

我们尝试将其作为一个表的子查询,结果中没有出现
,但它运行了10分钟,几乎使我们的网站崩溃

一定有更好的办法。可能是一个
连接

使用函数

Select * from A where not exists(select * from B);
改用函数

Select * from A where not exists(select * from B);
:

哪种方法最适合选择一个表中存在但缺少的值 另一个

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

但是,这三种方法[
不在
不存在
左连接
] 生成三个不同的计划,由三个不同的部门执行 代码片段。执行
存在
谓词的代码约为30%
比那些执行
索引\u子查询
左连接
优化为使用
不存在
方法

这就是为什么在MySQL中搜索缺失值的最佳方法是使用
左连接
/
为NULL
不在
中,而不是
不在
存在

如果您看到的
不在
中的性能不令人满意,则切换到
左连接
/
为空或
不存在
,将无法提高此性能,相反,您需要采取不同的路径来优化此查询,例如添加索引

哪种方法最适合选择一个表中存在但缺少的值 另一个

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

但是,这三种方法[
不在
不存在
左连接
] 生成三个不同的计划,由三个不同的部门执行 代码片段。执行
存在
谓词的代码约为30%
比那些执行
索引\u子查询
左连接
优化为使用
不存在
方法

这就是为什么在MySQL中搜索缺失值的最佳方法是使用
左连接
/
为NULL
不在
中,而不是
不在
存在

如果您看到的
不在
中的性能不令人满意,那么切换到
左联接
/
为空
不存在
,将无法提高此性能,相反,您需要采取不同的路径来优化此查询,例如添加索引左联接。从

如果在ON或USING中没有与右表匹配的行 在左联接中,所有列都设置为NULL的行用于 右边的桌子。可以使用此事实查找表中 在另一个表中没有对应项:

选择left_-tbl.*从left_-tbl left加入left_-tbl.id上的right_-tbl= right_tbl.id,其中right_tbl.id为空

此示例查找左tbl中id值不为的所有行 出现在右侧(即,左侧的所有行没有 右侧的对应行(待定)

左连接。从

如果在ON或USING中没有与右表匹配的行 在左联接中,所有列都设置为NULL的行用于 右边的桌子。可以使用此事实查找表中 在另一个表中没有对应项:

选择left_-tbl.*从left_-tbl left加入left_-tbl.id上的right_-tbl= right_tbl.id,其中right_tbl.id为空

此示例查找左tbl中id值不为的所有行 出现在右侧(即,左侧的所有行没有 右侧的对应行(待定)


希望
左侧外部连接将完成此工作

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

希望
左侧外部连接将完成此工作

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

OP请求加入,因为子查询占用了他在not in中使用的大量时间。Not exists(不存在)要快得多引擎解析
Not exists(不存在)的方式要快得多。我不是在问你,我只是想知道。OP请求加入子查询需要花费很多时间,他正在使用not in。Not exists(不存在)要快得多引擎解析
Not exists(不存在)的方式要快得多。我不是在问你,我只是想知道。我喜欢卡西诺的帖子——我只是希望它们能更频繁一点。也就是说,我认为MySQL的最新版本一定改进了IN的优化,并且以某种方式存在,因为在我的系统上测试相同的DDL和DML会返回几乎完全相反的性能统计数据:LEFT JOIN:12.43;6.04中没有;不存在:5.93。顺便说一句,联接(0个结果)在0秒内执行。@Good point。。。这项分析几乎是4年前完成的。我很惊讶,
左连接
花费的时间是其他方法的两倍。。。但是由于
不在
不存在
之间的距离在2%以内,我仍然建议OP研究索引这些表,因为两个25k行的表之间的反连接应该需要毫秒,而不是分钟。这家伙知道他在说什么。索引就是答案。我喜欢Quassnoi的帖子——我只是希望它们能更频繁一点。也就是说,我认为MySQL的最新版本一定改进了IN的优化,并且以某种方式存在,因为在我的系统上测试相同的DDL和DML会返回几乎完全相反的性能统计数据:LEFT JOIN:12.43;6.04中没有;不存在:5.93。顺便说一句,联接(0个结果)在0秒内执行。@Good point。。。这项分析几乎是4年前完成的。我很惊讶,
左连接
花费的时间是其他方法的两倍。。。但
不在
中且
不存在