2012-01-13 49 views
3

我想使用mysql分区表将表划分为YEAR和WEEK编号。我知道如何使用mysql合并表执行此操作,但分区表是不同的。有人可以请帮助下面的表模式?按年份划分的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; 

回答

2

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

dateandtime需要成为PRIMARY或UNIQUE键的一部分吗? – Bretticus 2012-05-18 01:18:16

+0

不......我用于每天有超过12百万行的日志表,所以在同一秒内也有许多行,所以UNIQUE在我的情况下是不可能的。 – Marki555 2012-05-18 08:17:12