【问题标题】:Mysql puts all data in one partitionMysql 将所有数据放在一个分区中
【发布时间】: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


    【解决方案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
    

    );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 2012-07-01
      • 2022-01-03
      • 2017-06-23
      • 1970-01-01
      • 2015-02-17
      • 2016-11-26
      相关资源
      最近更新 更多