php – 使用子查询和连接查询更新行 – 真的很慢

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 使用子查询和连接查询更新行 – 真的很慢脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要将表’A’的标志从’X’重置为’Y’,其中行的update_date满足条件1. update_date> 1个月,2.标志=’X’& 3. tyPE = 1.

并且针对另一个表’B’检查update_date.我希望以下查询将解释我究竟需要什么.此查询也适合我.但问题是需要花费太长时间.实际上我的表A& B更大,几乎包含十亿行,大约有10列.

当我运行我的子查询选择A.id时,我立即得到了结果.

SELECT a.id 
 From A a 
 JOIN B b 
 ON (a.id = b.id 
       AND a.name = b.name 
       AND a.type = 1 
       AND a.flag = 'X' 
       AND a.update_date > DATE_Sub(Now(),INTERVAL 1 MONTH) tmp_table)

但是只有更新查询使我放了限制也需要花费很多时间.

UPDATE A 
SET flag='Y' 
WHERE id IN (SELECT a.id 
             From A a 
             JOIN B b 
             ON (a.id = b.id 
                   AND a.name = b.name 
                   AND a.type = 1 
                   AND a.flag = 'X' 
                   AND a.update_date > DATE_SUB(Now(),INTERVAL 1 MONTH) tmp_table))  
             LIMIT 100

我正在寻找我的查询的替代解决方案,使其快速.希望我能为它编写一个存储过程.但是在SP中我应该为每个target_ids循环一次吗?

我不希望在PHP中编写两个单独的查询,因为我的PHP脚本中有很多线程在cron上运行,返回相同的结果(时间延迟).

还要注意,我确实有足够的列索引.

希望通过限制更新限制.即,每次运行更新1000条记录.

解决方法

改变与存在

EXISTS会更快,因为一旦发动机发现了撞击,它就会退出,因为条件证明是正确的.使用IN,它将在进一步处理之前收集子查询中的所有结果.

UPDATE A a
JOIN B b 
ON (a.id = b.id 
               AND a.name = b.name 
               AND a.type = 1 
               AND a.flag = 'X' 
               AND a.update_date > DATE_SUB(Now(),INTERVAL 1 MONTH))
SET a.flag='Y'
ORDER BY a.id LIMIT 1000;

EDITED支持LIMIT的替代品(IT将仅更新前100条记录)

SET @rn = 0;
UPDATE A a
JOIN (SELECT @rn:=@rn+1 AS rId,id,name FROM B b 
      JOIN A a 
      ON (@rn < 100 AND a.id = b.id 
               AND a.name = b.name 
               AND a.type = 1 
               AND a.flag = 'X' 
               AND a.update_date > DATE_SUB(Now(),INTERVAL 1 MONTH)
      ) 

) b 
ON (a.id=b.id) 
SET a.flag='Y'
WHERE b.rId < 100;

使用exists子句

Update A a 
SET a.flag='Y'
WHERE EXISTS (SELECT 1 FROM B b WHERE a.id = b.id 
               AND a.name = b.name 
               AND a.type = 1 
               AND a.flag = 'X' 
               AND a.update_date > DATE_SUB(Now(),INTERVAL 1 MONTH)) 
ORDER BY a.id LIMIT 1000;

希望这可以帮助

脚本宝典总结

以上是脚本宝典为你收集整理的php – 使用子查询和连接查询更新行 – 真的很慢全部内容,希望文章能够帮你解决php – 使用子查询和连接查询更新行 – 真的很慢所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。