【发布时间】:2013-04-20 04:38:56
【问题描述】:
我有一个 30M 行的表,我想按日期对其进行分区。
mysql > SHOW CREATE TABLE `parameters`
CREATE TABLE `parameters` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`add_time` datetime DEFAULT NULL,
...(etc)
) ENGINE=MyISAM AUTO_INCREMENT=28929477 DEFAULT CHARSET=utf8
表存储过去 5 年的数据,并且行数急剧增加。我想按年(2009 年、2010 年、2011 年、2012 年、2013 年)对其进行分区。
ALTER TABLE parameters DROP PRIMARY KEY, ADD INDEX(id);
ALTER TABLE parameters PARTITION BY RANGE (TO_DAYS(id)) (
PARTITION y2009 VALUES LESS THAN (TO_DAYS('2010-01-01')),
PARTITION y2010 VALUES LESS THAN (TO_DAYS('2011-01-01')),
PARTITION y2011 VALUES LESS THAN (TO_DAYS('2012-03-01')),
PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')),
PARTITION y2013 VALUES LESS THAN MAXVALUE
);
Everyting 在开发服务器上工作,但在生产服务器上存在问题。 问题:几乎所有的行都移到了第一个分区(y2009)。但是数据是按年份均匀分布的。物理上,DATA 文件夹中有很大的 y2009.myd 文件,而其他分区的大小要小得多。 我还尝试重新组织第一个分区以排除 Null 日期:
alter table raw
reorganize partition y2012 into (
PARTITION y0 VALUES LESS THAN (0),
PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')),
);
P.S.:生产服务器和开发服务器的 MySQL 5.1.37 版本相同
【问题讨论】:
标签: mysql database-partitioning mysql-5.1