我尝试比较两个表之间的两个zipcode列,以查看第二个表中是否缺少值。
我首先想用mysql做,我的查询就像是
'SELECT code FROM t1 WHERE t1 NOT IN (select code FROM t2)'
但它真的很慢,所以我尝试了另一种方式:
我做了两个选择,然后将结果与array_diff()
进行了比较。
使用mysql:几分钟,有时崩溃
使用PHP:不到1秒。
有人可以解释这些差异吗? 我的SQL查询错了吗?
答案 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
建立索引可加快您的查询速度。如果表只提供一列,则搜索与源表具有相同内容的索引表将完全相同且冗余。否则,我强烈建议索引