0

3,000 万行のテーブルがあり、日付でパーティション分割したいと考えています。

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 で動作しますが、production-server で問題が発生します。問題: ほとんどすべての行が最初のパーティション (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')),
);

PS: 本番サーバーと開発サーバーには同じバージョンの MySQL 5.1.37 があります

4

1 に答える 1

1

パーティションの ID ではなく、RANGE で日付列を使用する必要があります。
私はに変更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

);

于 2013-04-26T06:11:21.630 に答える