サーバー間で大きなテーブル (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 の実行中、スレッドはほとんどの時間をシステム ロック状態で費やしているようです。