PHP array_diff VS mysql NOT IN

时间:2015-02-18 08:57:16

标签: php mysql

我尝试比较两个表之间的两个zipcode列,以查看第二个表中是否缺少值。

我首先想用mysql做,我的查询就像是

'SELECT code FROM t1 WHERE t1 NOT IN (select code FROM t2)'

但它真的很慢,所以我尝试了另一种方式: 我做了两个选择,然后将结果与array_diff()进行了比较。

使用mysql:几分钟,有时崩溃

使用PHP:不到1秒。

有人可以解释这些差异吗? 我的SQL查询错了吗?

1 个答案:

答案 0 :(得分:3)

如果您的主表格有5万行,则在您的查询中使用子选择将导致 1 + 50k执行选择。一个用于第一个表,50k选择,每行一个。服务器将该行与每次迭代主表时重新加载的子选择进行比较。这就是你的sql代码花费时间的原因,也可能是一个巨大的内存问题。

请参阅serjoschas有关加入的信息以在sql中修复它,它应该比你的php解决方案更快。

  

检查表中缺少哪些值(与另一个相比)可以通过LEFT或RIGHT JOIN轻松完成,它们只是针对这样的操作而做的...或者看看这个:How to Find Missing Value Between Two Mysql Tables - serjoscha

一个解决方案:

SELECT code FROM t1
WHERE code NOT IN ( SELECT code FROM t2 )

将是:

SELECT t1.code 
FROM t1
LEFT JOIN t2
ON t1.code = t2.code
WHERE t2.code is null

试一试。另请查看索引Cyclone建议:

  

如果您没有索引,则应该明确添加索引,因为这样可以加快查询速度。您可以添加如下索引:ALTER TABLE ADD INDEX code_idx(code)这应该对两个表都这样做。如果你然后为查询执行EXPLAIN,你会看到像使用where;使用索引;使用好的连接缓冲区 - Cyclone

建立索引可加快您的查询速度。如果表只提供一列,则搜索与源表具有相同内容的索引表将完全相同且冗余。否则,我强烈建议索引 代码列,这会导致性能大幅提升并减少内存消耗。