2011-08-19 4 views
5

に変換:私はそれでライブデータと、次のテーブル構造を持つパーティション表

CREATE TABLE IF NOT EXISTS `userstatistics` (
    `user_id` int(10) unsigned NOT NULL, 
    `number_logons` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profileminiviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profilefullviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_mailsreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_interestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_favouratesreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_friendshiprequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_imchatrequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `yearweek` int(6) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`user_id`,`yearweek`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

私は次のような構造を持つパーティション表にこれを変換したい:

CREATE TABLE IF NOT EXISTS `userstatistics` (
    `user_id` int(10) unsigned NOT NULL, 
    `number_logons` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profileminiviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profilefullviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_mailsreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_interestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_favouratesreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_friendshiprequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_imchatrequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `yearweek` int(6) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`user_id`,`yearweek`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
/*!50100 PARTITION BY RANGE (yearweek) 
(PARTITION userstats_201108 VALUES LESS THAN (201108) ENGINE = InnoDB, 
    PARTITION userstats_201109 VALUES LESS THAN (201109) ENGINE = InnoDB, 
    PARTITION userstats_201110 VALUES LESS THAN (201110) ENGINE = InnoDB, 
    PARTITION userstats_201111 VALUES LESS THAN (201111) ENGINE = InnoDB, 
    PARTITION userstats_201112 VALUES LESS THAN (201112) ENGINE = InnoDB, 
    PARTITION userstats_201113 VALUES LESS THAN (201113) ENGINE = InnoDB, 
    PARTITION userstats_201114 VALUES LESS THAN (201114) ENGINE = InnoDB, 
    PARTITION userstats_201115 VALUES LESS THAN (201115) ENGINE = InnoDB, 
    PARTITION userstats_201116 VALUES LESS THAN (201116) ENGINE = InnoDB, 
    PARTITION userstats_201117 VALUES LESS THAN (201117) ENGINE = InnoDB, 
    PARTITION userstats_201118 VALUES LESS THAN (201118) ENGINE = InnoDB, 
    PARTITION userstats_201119 VALUES LESS THAN (201119) ENGINE = InnoDB, 
    PARTITION userstats_201120 VALUES LESS THAN (201120) ENGINE = InnoDB, 
    PARTITION userstats_201121 VALUES LESS THAN (201121) ENGINE = InnoDB, 
    PARTITION userstats_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */; 

どのようにすることができます私はこの変換をしますか?

単に

ALTER TABLE 'userstatistics' (

に2つ目のSQL文の最初の行を変更すると、このそれを行うだろうか? 5.1へのMySQL 5.0から行く

。 ALTER TABLEについてのマニュアルhttp://dev.mysql.com/doc/refman/5.1/en/partitioning-management-range-list.html

答えて

5

まず、あなたは、MySQL 5.1以降を実行する必要があります。 MySQL 5.0はパーティショニングをサポートしていません。

二重引用符(文字列と日付を区切る)とバックティック(MySQLのテーブルとカラム識別子を区切る)の違いに注意してください。適切な場所に正しいタイプを使用してください。

ALTER TABLE 'userstatistics' (

次のようになります:

ALTER TABLE `userstatistics` (

最後に、はい、あなたはALTER TABLEでパーティションにテーブルを再構築することができ、あなたの例では、引用符の間違ったタイプを使用していますので、私は、これを言及します。ここでは正確なコピーは、私は、MySQL 5.1.57でテストの文から&ペーストです:あなたはすでにこの表に大量のデータを持っている場合、それはかかりますので、これは、テーブルの再構築を引き起こすこと

ALTER TABLE userstatistics PARTITION BY RANGE (yearweek) (
PARTITION userstats_201108 VALUES LESS THAN (201108) ENGINE = InnoDB, 
PARTITION userstats_201109 VALUES LESS THAN (201109) ENGINE = InnoDB, 
PARTITION userstats_201110 VALUES LESS THAN (201110) ENGINE = InnoDB, 
PARTITION userstats_201111 VALUES LESS THAN (201111) ENGINE = InnoDB, 
PARTITION userstats_201112 VALUES LESS THAN (201112) ENGINE = InnoDB, 
PARTITION userstats_201113 VALUES LESS THAN (201113) ENGINE = InnoDB, 
PARTITION userstats_201114 VALUES LESS THAN (201114) ENGINE = InnoDB, 
PARTITION userstats_201115 VALUES LESS THAN (201115) ENGINE = InnoDB, 
PARTITION userstats_201116 VALUES LESS THAN (201116) ENGINE = InnoDB, 
PARTITION userstats_201117 VALUES LESS THAN (201117) ENGINE = InnoDB, 
PARTITION userstats_201118 VALUES LESS THAN (201118) ENGINE = InnoDB, 
PARTITION userstats_201119 VALUES LESS THAN (201119) ENGINE = InnoDB, 
PARTITION userstats_201120 VALUES LESS THAN (201120) ENGINE = InnoDB, 
PARTITION userstats_201121 VALUES LESS THAN (201121) ENGINE = InnoDB, 
PARTITION userstats_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB); 

注意実行するにはしばらく時間がかかる。データの量、ハードウェアの速度、およびその他の要因によって正確な時間は異なります。テーブルが再構成されている間、テーブルはロックされており、他のクエリによる読み書きには使用できません。

+0

完璧に... thx :) – Adam

+0

ビルのステップバイステップドキュメントは確かにヘルプメニューより優れています。 :-)そしてこのパーティションは、あなたが1ヶ月間にもっと多くの範囲クエリを実行することを前提としています。 –

+0

+1の非常に詳細な情報 –

0

ルック。

そして、特に、ALTER TABLE ... DROP/COALESCEは/ REORGANIZE/ADDパーティションSQLは、あなたのパーティションを管理するために、ほぼすべての機能を提供します。ハッシュは整数のみに使用することができることを

ノート。 ALTER TABLE•

... ADD PARTITIONのNDBテーブルで使用する場合を除き、一切の一時テーブルを作成しません。 RANGEまたはLISTパーティションのADDまたはDROP操作は、即時操作またはそれに近い操作です。 HASHまたはKEYパーティションのADDまたはCOALESCE操作は、変更されたパーティション間でデータをコピーします。 LINEAR HASHまたはLINEAR KEYが使用されていない限り、これは新しいテーブルの作成とほぼ同じです(操作はパーティションごとに行われます)。 REORGANIZE操作は変更されたパーティションのみをコピーし、変更されていないパーティションには触れません。

関連する問題