Mysql select不在表中

我有2个表(A和B)具有相同的主键。 我想selectA中的所有行,而不是B中的所有行。

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

但是看起来相当糟糕(A只有10万行约2秒,而B只有3万-10万)

有没有更好的方式来运行这个? 也许作为一个左连接?

 select * from A left join B on Ax=By where By is null; 

在我的数据上,这似乎运行得稍快(〜10%),但一般呢?

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

我想你最后的声明是最好的方法。 你也可以试试

 SELECT A.* from A left join B on Ax = By where By is null 

我还使用“where table2.id is null”types条件的左连接。

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

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

这帮了我很多。 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 ;