2

サーバー間で大きなテーブル (15 億行) をエクスポートしています。これがテーブル形式です。

CREATE TABLE IF NOT EXISTS `partitionedtable` (
  `domainid` int(10) unsigned NOT NULL,
  `instanceid` int(10) unsigned NOT NULL,
  `urlid` int(10) unsigned NOT NULL,
  `adjrankid` smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`domainid`,`instanceid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (MOD(domainid,8192))
(PARTITION p0 VALUES LESS THAN (1) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (2) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (3) ENGINE = InnoDB
 ...
 PARTITION p8191 VALUES LESS THAN (8192) ENGINE = InnoDB)

データは PK 順で新しいサーバーにエクスポートされ、結果として 8192 個のテキスト ファイルが生成されました。これは、ファイルあたり約 200K レコードに相当します。

ファイルを新しいテーブルにインポートすることを 0 から 8191 まで繰り返すだけです。

LOAD DATA INFILE '/home/backup/rc/$i.tsv INTO TABLE partitionedtable PARTITION (p$i)

これらのそれぞれのインポートには 1 秒しかかからないと考えていますが、約 6 秒かかります。

サーバーのスペックはこちら。 http://www.ovh.co.uk/dedicated_servers/sp_32g.xml

プロセスのボトルネックとなるサーバーでの処理は他にあまりありません。

MOD() によるパーティショニングが断片化を引き起こす可能性はありますか? 各パーティションは個別のテーブルと見なされるため、断片化は発生せず、データは PK 順序で挿入されるため、断片化は発生しないという印象を受けました。

  • 追加 - おそらく便利です...これらの設定はバッチの開始時に適用されました。

    SET 自動コミット = 0; SET Foreign_key_checks=0; SET sql_log_bin=0; SET unique_checks=0;

すべてのファイルの後に COMMIT が適用されます。

LOAD DATA INFILE の実行中、スレッドはほとんどの時間をシステム ロック状態で費やしているようです。

4

1 に答える 1