我需要将表的标志'A'
从一行'X'
的'Y'
update_date 满足条件的位置重置1. update_date > 1 month, 2. flag = 'X' & 3. type = 1
。
并且根据另一个表检查 update_date 'B'
。我希望下面的查询能解释我到底需要什么。这个查询也适用于我。但问题是耗时太长。实际上我的表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 多条记录。