【发布时间】:2015-03-02 18:45:44
【问题描述】:
我有三张桌子:
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
我想将表 grade 中所有超过一个月且不在表 peer_review 中的行移动到 grade_archive。
这些表被积极使用,因此任何插入都必须具有低优先级,以避免在运行时中断现有和新进程。
完成后,预期的表格行应如下所示:
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);
但是对于大型表,这些子选择非常慢,我对结果感到紧张。寻找更好的方向。
【问题讨论】:
标签: mysql query-optimization insert-select