Mysql将所有数据放在一个分区中

时间:2013-04-26 05:01:55

标签: mysql database-partitioning mysql-5.1

我有一个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适用于dev-server,但生产服务器上存在问题。 问题:几乎所有行都移动到第一个分区(y2009)。但是数据是按年分布的。物理上,DATA文件夹中有大的y2009.myd文件,而其他分区的大小要小得多。 此外,我尝试重新组织第一个分区,以排除空日期:

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

1 个答案:

答案 0 :(得分:1)

您需要在RANGE中使用日期列而不是分区的id 我已将TO_DAYS(id)更改为 TO_DAYS(add_time)

尝试以下:

ALTER TABLE parameters PARTITION BY RANGE (TO_DAYS(add_time)) (
    PARTITION y0 VALUES LESS THAN (TO_DAYS('2009-01-01')),
    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

);