脚本宝典收集整理的这篇文章主要介绍了php – 使用子查询和连接查询更新行 – 真的很慢,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
并且针对另一个表’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,请注明来意。