这是未经测试的,但应该接近。
CREATE TABLE user_actions (
auto_id INT NOT NULL AUTO_INCREMENT,
type INT NOT NULL,
user_id INT NOT NULL,
insert_datetime DATE NOT NULL,
action_id INT NOT NULL)
PARTITION BY RANGE(TO_DAYS(insert_datetime))
(
PARTITION p0 VALUES LESS THAN (to_days('2011-06-01')),
PARTITION p1 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p11 VALUES LESS THAN MAXVALUE
);您可以通过以下方式进行管理:
您可以让MAXVALUE分区始终代表您的“活动”(在您的情况下是当前的6个月期间)分区。当周期结束时,您可以拆分/重新组合MAXVALUE分区,其中过去的时间段进入新分区,MAXVALUE分区再次表示当前/活动分区。
例如,2011年1月1日你将有一个分区,我们称之为pM,它将存储所有内容,因为它具有LESS THAN MAXVALUE子句。然后经过6个月后,您将重组/拆分该单个分区,创建一个新分区,其中包含前6个月的所有数据,MAXVALUE分区再次表示当前/活动期间。
-- Untested, but again should be close
ALTER TABLE t1 REORGANIZE PARTITION (pM) INTO
(PARTITION p20110101 VALUES LESS THAN (to_days('2011-07-01'),
PARTITION pM VALUES LESS THAN MAXVALUE);您还可以考虑进行子分区。您可以通过HASH对user_id进行子分区,从而进一步降低基于user_id的数据查询的I / O和成本。
有关分区的更多信息,请查看以下链接。
MySQL Partitioning
Partition Managment