我有两张几乎相同的牌桌。第二个是"奴隶"第一个。第一个表有autoincrement int ID列,第二个表有ID2,它是索引唯一的int,但不是自动增量的。 ID2是ID的类比。
我需要找到最快的方法来检测第二个表中的新行(第一个表中不存在的那些ID2),反之亦然,第一个表中的新行(第二个表中不存在的那些ID)。我找到的最快的方法是
select SQL_NO_CACHE
tab1.ID
from `tab1`
left join `tab2`
on tab1.ID = tab2.ID2
where
isnull(tab2.ID2)
在~200k记录上取出2.5秒。你可能会建议什么来获得更快的结果?
答案 0 :(得分:1)
SELECT * FROM Tab2 WHERE
NOT EXISTS (SELECT 'x' FROM Tab1 where
Tab1.ID= Tab2.ID)
我认为这个查询可以让你获得更快的结果。
答案 1 :(得分:0)
使用is null
:
select SQL_NO_CACHE tab1.ID
from `tab1` left join
`tab2`
on tab1.ID = tab2.ID2
where tab2.id2 is null;
此表现应相当于:
select tab1.id
from tab1
where not exists (select 1 from tab2 where tab2.id2 = tab.id);
但值得尝试这两种方法。
请注意,这些版本与您要求的版本相反 - 查找tab1
中不在tab2
中的行。根据你真正想要的东西,如何切换逻辑应该是显而易见的。