1

数百万行の大きなテーブルでパーティションを作成する際に問題があります。

CREATE TABLE  `searcheg`.`pages` (
  `urlId` int(9) NOT NULL AUTO_INCREMENT,
  `url` varchar(1024) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `urlhash` binary(16) NOT NULL,<< MD5 unhex.
  PRIMARY KEY (`urlId`),
  UNIQUE KEY `urlhash` (`urlhash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

これをどのように分割しますか?urlhash多数の行を挿入して繰り返しをチェックする必要があるため、一意である必要があります。パーティションにはすべての一意の列を含める必要があり、整数以外の値にすることはできません。パーティションの理由の 1 つは、.ibd が 50G を超えて大きくなり、それらを分割したいので、より管理しやすいサイズに縮小することです。主キーとしてのurlIDは、挿入が行われるたびに行が並べ替えられるのを防ぐためのものです。エントリの重複を防ぐために一意の URL ハッシュを使用します。主キーを削除せずにテーブルを分割する方法を探しています。

4

1 に答える 1

0

MySQL v5.5 を使用している場合は、新しいPARTITION BY RANGE COLUMNSオプションを使用できます。冗長なurlID列を削除usrhashして主キーとして定義できる場合、テーブル定義は次のようになります。

CREATE TABLE pages (
  url VARCHAR(1024) NOT NULL,
  urlhash BINARY(16) NOT NULL,
  PRIMARY KEY (urlhash)
)
PARTITION BY RANGE COLUMNS (urlhash) (
  PARTITION p0 VALUES LESS THAN ('j'),
  PARTITION p1 VALUES LESS THAN ('r'),  -- split in as many ranges as you wish
  PARTITION p2 VALUES LESS THAN (MAXVALUE)
) ;

(フレームワークなどで) が必要な場合、urlID主キーまたは一意のインデックスには「テーブルのパーティション関数にすべての列を含める必要がある」ため、わかりません...

于 2012-10-16T01:21:52.187 に答える