用于查找一个表中的行而不是另一个表中的行的MySQL查询
假设我在两个表中有大约25000条记录,每个表中的数据应该是相同的。如果我需要查找表A中但不在表B中的任何行,那么最有效的方法是什么 我们尝试将其作为一个表的子查询,结果中没有出现用于查找一个表中的行而不是另一个表中的行的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); : 哪种方法最
,但它运行了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年前完成的。我很惊讶,左连接
花费的时间是其他方法的两倍。。。但不在
中且不存在
在