54

我有 2 个具有相同主键的表(A 和 B)。我想选择 A 中而不是 B 中的所有行。以下工作:

select * from A where not exists (select * from B where A.pk=B.pk);

但是它似乎很糟糕(A 中只有 100k 行约 2 秒,B 中少 3-10k 行)

有没有更好的方法来运行它?也许作为左连接?

select * from A left join B on A.x=B.y where B.y is null;

根据我的数据,这似乎运行得稍微快一些(~10%),但总的来说呢?

4

5 回答 5

58

我认为你的最后陈述是最好的方法。你也可以试试

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
于 2008-12-09T20:09:52.587 回答
35

我使用第二个示例格式的查询。连接通常比相关子查询更具可扩展性。

于 2008-12-09T20:47:39.530 回答
2

我还使用带有“table2.id 为空”类型标准的左连接。

当然似乎比嵌套查询选项更有效。

于 2009-05-27T14:52:17.600 回答
2

连接通常更快(在 MySQL 中),但如果您发现它仍然移动缓慢,您还应该考虑您的索引方案。通常,任何设置为外键的字段(使用 INNODB)都已经设置了索引。如果您使用的是 MYISAM,请确保 ON 语句中的所有列都已编入索引,并考虑将 WHERE 子句中的所有列添加到索引的末尾,以使其成为覆盖索引。这使引擎可以访问索引中所需的所有数据,而无需再次返回原始数据。请记住,这将影响插入/更新/删除的速度,但可以显着提高查询速度。

于 2010-09-28T21:58:20.243 回答
-2

这对我帮助很大。Joins总是比子查询更快地给出结果:

SELECT tbl1.id FROM tbl1 t1
LEFT OUTER JOIN tbl2 t2 ON t1.id = t2.id 
WHERE t1.id>=100 AND t2.id IS NULL ;
于 2015-12-14T10:25:24.850 回答