我将尝试比较两个表中的两列邮政编码,以查看第二个表中是否缺少值。
我最初想使用mysql进行操作,我的查询大致如下:
'SELECT code FROM t1 WHERE t1 NOT IN (select code FROM t2)'
但是它真的很慢,所以我尝试了另一种方法:
我做了两个选择,然后用array_diff()
比较结果。
使用mysql:几分钟,有时会崩溃
使用PHP:少于1秒。
有人能解释这些差异吗? 我的SQL查询有问题吗?
一个解决方案:检查表中缺失哪些值(与另一个表相比)可以轻松地通过左或右连接来完成,它们只是为此类操作而制作的...或者看看这篇文章:如何在两个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; Using index; Using join buffer 的内容,这是很好的 - Cyclone
索引可以加快查询速度。 如果表只提供一个列,则使用与源表相同内容的索引表搜索将完全相同且冗余。否则,我强烈建议在t2的代码列上创建索引,这会大大提高性能并减少内存消耗。
SELECT t1.code
,因为在这种情况下 code
是不明确的。 - Cyclonecode
LEFT
或RIGHT
JOIN
轻松地检查一张表中缺失的值(与另一张表相比),这就是它们所用的操作方式。或者可以查看这个链接:https://dev59.com/HkrSa4cB1Zd3GeqPVU8B - serjoschaALTER TABLE <table> ADD INDEX code_idx (code)
这应该对两个表都进行。如果您执行EXPLAIN
查询,您会看到类似于Using where; Using index; Using join buffer
的内容,这是好的。 - Cyclonecode