行の update_dateが条件を満たす場所'A'
からテーブルのフラグをリセットする必要があります。'X'
'Y'
1. update_date > 1 month, 2. flag = 'X' & 3. type = 1
そして update_date は別のテーブルに対してチェックされます'B'
。次のクエリで、必要なものが正確に説明されることを願っています。また、このクエリは私にとってはうまくいきます。しかし、問題は時間がかかりすぎることです。実際、私のテーブルA & B
ははるかに大きく、ほぼ10億行が含まれており、約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 で 2 つの個別のクエリを記述したくありません。同じ結果 (時間の待ち時間) を返す cron で実行されている PHP スクリプトのスレッドが多数あるためです。
また、列に十分なインデックスを作成していることにも注意してください。
制限ごとに制限を更新したい。つまり、実行ごとに 1000 以上のレコードを更新します。