私は3つのテーブルを持っています:
grade (grade_id, grade_value, grade_date) ~100M rows
grade_archive (grade_id, grade_value, grade_date) 0 rows
peer_review (grade_id, peer_review_value, peer_review_date) ~10M rows
table から1 か月以上経過していてtablegrade
にないすべての行を移動したいと考えています。grade_archive
peer_review
テーブルはアクティブに使用されるため、実行中に既存のプロセスと新しいプロセスが中断されないように、挿入の優先度を低くする必要があります。
完了すると、予期されるテーブル行は次のようになります。
grade ~10M rows
grade_archive ~90M rows
peer_review ~10M rows
私はそれが近いものだと想像します:
INSERT
LOW_PRIORITY
INTO grade_archive
(grade_id,grade_value,grade_date)
SELECT
grade_id,grade_value,grade_date
FROM
grade
WHERE
grade_date < DATE_ADD(NOW(), INTERVAL -1 MONTH)
AND grade_id NOT IN
(
SELECT grade_id FROM peer_review
);
grade
次に、アーカイブ テーブルのすべての行を削除して、テーブルをクリーンアップします。
DELETE LOW_PRIORITY FROM grade WHERE grade_id IN (SELECT grade_id FROM grade_archive);
しかし、これらのサブセレクトは、大きなテーブルでは非常に遅く、結果が気になります。より良い方向を探しています。