加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP array_diff VS mysql NOT IN

发布时间:2020-12-13 16:55:31 所属栏目:PHP教程 来源:网络整理
导读:我试图比较两个表之间的两个zipcode列,以查看第二个表中是否缺少值. 我首先想用mysql做,我的查询是这样的 'SELECT code FROM t1 WHERE t1 NOT IN (select code FROM t2)' 但它真的很慢,所以我尝试了另一种方式: 我做了两个select,然后将结果与array_diff()
我试图比较两个表之间的两个zipcode列,以查看第二个表中是否缺少值.

我首先想用mysql做,我的查询是这样的

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

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

用mysql:几分钟,有时崩溃

使用PHP:不到1秒.

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

解决方法

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

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

Checking which values are missing within a table (compared to another) can easily be done with a LEFT or RIGHT JOIN they are just made for actions like this.. alternatively take a look at this: 07001 – 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所示:

If you don’t have an index you should definitly add one since this will speed up your query. You could add an index like this: ALTER TABLE ADD INDEX code_idx (code) this should be done for both tables. If you then were to execute EXPLAIN for the query you would see something like Using where; Using index; Using join buffer which is good – Cyclone

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读