我有一个每晚都会处理的日志表。将对昨天记录的数据进行处理。处理完成后,我想删除当天的数据。与此同时,我有新数据进入当前表格。我根据星期几对表进行了分区。我希望我可以在没有争用的情况下同时删除数据和插入数据。每天处理的数据可能多达300万行。我搜索了一些信息,但没有找到任何确认我的假设 我不想在编写添加分区和删除分区的作业时遇到麻烦,正如我在其他示例中看到的那样。我希望使用七个部分来实现解决方案。例如
CREATE TABLE `professional_scoring_log` (
`professional_id` int(11) NOT NULL,
`score_date` date NOT NULL,
`scoring_category_attribute_id` int(11) NOT NULL,
`displayable_score` decimal(7,3) NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`professional_id`,`score_date`,`scoring_category_attribute_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (DAYOFWEEK(`score_date`))
(PARTITION Sun VALUES LESS THAN (2) ENGINE = InnoDB,
PARTITION Mon VALUES LESS THAN (3) ENGINE = InnoDB,
PARTITION Tue VALUES LESS THAN (4) ENGINE = InnoDB,
PARTITION Wed VALUES LESS THAN (5) ENGINE = InnoDB,
PARTITION Thu VALUES LESS THAN (6) ENGINE = InnoDB,
PARTITION Fri VALUES LESS THAN (7) ENGINE = InnoDB,
PARTITION Sat VALUES LESS THAN (8) ENGINE = InnoDB) */
当处理昨天数据的作业完成后,它将删除score_date = current_date-1的所有记录。在任何时候,我可能只会在一个或两个分区中拥有数据,具体取决于一天中的时间。
我的假设是否存在漏洞?
答案 0 :(得分:1)
我想我的一条评论就是为什么不使用drop / add分区语法?它必须比DELETE FROM更有效..其中..;并且它只是两个电话 - 没什么大不了的 - 存储“原型”语句并替换一周中每一天所需的“太阳”和“2” - 我经常使用sprintf做这个
ALTER TABLE `professional_scoring_log` DROP PARTITION Sun;
ALTER TABLE `professional_scoring_log` ADD PARTITION (
PARTITION Sun VALUES LESS THAN (2)
);