MySQL按年和周分区

时间:2012-01-13 16:45:07

标签: mysql partitioning

我想使用mysql分区表将表分区为YEAR和WEEK号。我确切知道如何使用mysql合并表,但分区表是不同的。有人可以帮助解决下表模式吗?

CREATE TABLE `tableName` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `dateandtime` datetime NOT NULL,
  `othervalue` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

它也必须在某个引擎中吗?

如果我将dateandtime存储为int(10)时间戳,我该怎么做?

CREATE TABLE `tableName` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `dateandtime` int(10) NOT NULL,
  `othervalue` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

1 个答案:

答案 0 :(得分:3)

MySQL 5.1无法按日期进行分区,因此您必须解决方法...通常按函数TO_DAYS(dateandtime)进行分区,例如:

CREATE TABLE tbl (
... ) ENGINE=InnoDB
PARTITION BY RANGE (to_days(dateandtime)) (
 PARTITION pNULL VALUES LESS THAN (0) ENGINE = InnoDB,
 PARTITION p20111218 VALUES LESS THAN (TO_DAYS('2011-12-18')) ENGINE = InnoDB,
 PARTITION p20111225 VALUES LESS THAN (TO_DAYS('2011-12-25')) ENGINE = InnoDB,
 PARTITION pNew VALUES LESS THAN MAXVALUE ENGINE = InnoDB
)

我在这里定义了4个分区 - 第一个只是为了完整性,所以将来插入日期不会失败。 (您不能插入不存在分区的值。)第一个分区用于提高性能 - 将在其中临时存储NULL值。实际上正在使用中间2个分区,每个分区保留一周的数据。

您可以使用ALTER TABLE tbl DROP PARTITION xyz删除旧分区(与仅删除旧行相比,这非常快)。您可以通过拆分最后一个分区来添加新分区:

ALTER TABLE tbl REORGANIZE PARTITION pNew INTO (
  PARTITION p20120115 VALUES LESS THAN (TO_DAYS('2012-01-16')),
  ...
  PARTITION pNew VALUES LESS THAN (MAXVALUE)
);