在两个mysql表中查找不同行的最快方法

时间:2015-06-14 22:21:50

标签: php mysql sql mysqli

我有两张几乎相同的牌桌。第二个是"奴隶"第一个。第一个表有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秒。你可能会建议什么来获得更快的结果?

2 个答案:

答案 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中的行。根据你真正想要的东西,如何切换逻辑应该是显而易见的。

相关问题