我想使用 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;
还有是不是一定要在某个引擎里?
如果我将日期和时间存储为 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;
最佳答案
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) );
关于MySQL 按年和周分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854095/