使用mysql分区表删除优化(MySQL 5.1)

时间:2012-01-11 19:13:24

标签: mysql sql-delete database-partitioning

我有一个每晚都会处理的日志表。将对昨天记录的数据进行处理。处理完成后,我想删除当天的数据。与此同时,我有新数据进入当前表格。我根据星期几对表进行了分区。我希望我可以在没有争用的情况下同时删除数据和插入数据。每天处理的数据可能多达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的所有记录。在任何时候,我可能只会在一个或两个分区中拥有数据,具体取决于一天中的时间。

我的假设是否存在漏洞?

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)
);