我有三张桌子:
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 移动grade
到grade_archive
超过一个月且不在 table 中的行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);
但是这些子选择对于大型表来说非常慢,我对结果感到紧张。寻找更好的方向。