7

ライブデータを含む次のテーブル構造があります。

 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) */;

この変換を行うにはどうすればよいですか?

2 番目の SQL ステートメントの最初の行を次のように変更するだけです。

 ALTER TABLE 'userstatistics' (

これでうまくいくでしょうか?

MySQL 5.0 から 5.1 へ。

4

2 に答える 2

8

まず、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);

これにより、テーブルの再構築が行われることに注意してください。このテーブルに既に大量のデータがある場合は、実行に時間がかかります。正確な時間は、データの量、ハードウェアの速度、およびその他の要因によって異なります。テーブルが再構築されている間、テーブルはロックされ、他のクエリによる読み書きができないことに注意してください。

于 2011-08-20T00:50:48.480 に答える
0

変更テーブルについては、この http://dev.mysql.com/doc/refman/5.1/en/alter-table.htmlを参照してください。

次に、特に変更テーブル。

ADD/DROP/COALESCE/REORGANIZE パーティション sql は、パーティションを管理するためのほぼすべての機能を提供します。

ハッシュは整数にのみ使用できることに注意してください。

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

于 2011-08-20T00:10:44.123 に答える