PHP array_diff VS mysql NOT IN


PHP array_diff VS mysql NOT IN

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

我最初想用mysql做这件事,我的查询有点像

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

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

与mysql:几分钟,有时崩溃

使用PHP:不到1秒。

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

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

请参阅serjoschas关于联接的信息,以在sql中修复它,它应该比您的php解决方案更快。

通过LEFT或RIGHT JOIN可以很容易地检查表中缺少哪些值(与其他值相比)——它们只是为这样的操作而创建的。。或者看看这个:如何在两个Mysql表之间找到缺失的值–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,您会看到类似Using where;使用索引;使用良好的连接缓冲区——Cyclone

索引可加快查询速度。如果表只提供一列,则搜索与源表内容相同的索引表将完全相同并且是多余的。否则,我强烈建议对t2的代码列进行索引,这将大大提高性能并减少内存消耗。