0

読み取り専用に使用されるテーブルを作成しているため、InnoDB の代わりに MyISAM を使用することにしました (ただし、提案は受け付けています)。ただし、このテーブルは非常に大きくする必要があります。各行は約 12 ~ 14 バイトですが、テーブル自体には数億から数十億の行が含まれます。

テーブルは次のようになります。

CREATE TABLE `tb1` ( `wid` int(11) NOT NULL DEFAULT '0',
`pid` int(11) NOT NULL DEFAULT '0',
`hit` tinyint(3) unsigned NOT NULL DEFAULT '0',
KEY `wid` (`wid`,`hit`,`pid`))
ENGINE=MyISAM DEFAULT CHARSET=latin1

LOAD DATA LOCAL INFILEチャンクを使用して、テキスト ファイルからすべてのデータを読み込んでいます。

約 20M 行をロードするのに 30 秒かかります。次に、1 億行のチャンクをロードし、10 分後にクエリをキャンセルした後、合計で 38M 行しかありません。(10分で18M行?..)

このタイプの負荷は、線形ではなく指数関数的であるようです。何故ですか?

増加し続けるインデックスがある場合、LOAD DATA INFILE を高速化するにはどうすればよいですか?

LOAD DATA INFILE の速度に関して、MyISAM の代わりに InnoDB を使用する利点はありますか?

インデックスなしですべてのデータをロードしてから、後で適用する方が速いでしょうか?

ご意見ありがとうございます。

4

2 に答える 2

1

とにかく走れ:

ALTER TABLE `name` DISABLE KEYS;

... do your query ...

ALTER TABLE `name` ENABLE KEYS;

また、すべての挿入には、テーブルに関連付けられた各インデックスへの挿入も必要です。したがって、インデックスを使用すると速度が低下します。

INSERT DELAYEDMyISAMでも使用できることに注意してください。

于 2012-09-28T00:57:06.947 に答える
1

スローダウンはインデックス作成です。キーを無効にするトリックを使用すると、データをより迅速にインポートできますが、キーを有効にする手順にはまだ時間がかかります。本当にやりたいことは、データをインポートするときに myisam_sort_buffer_size を最大にすることです。これに割り当てることができるメモリが多いほど、インデックスの並べ替えと更新のために MySQL がディスクにアクセスする必要が少なくなります。キーを無効にするトリックを引き続き使用でき、インポートが完了した後に値を下げることができます。

myisam_sort_buffer_size 値を変更すると、速度が劇的に向上する可能性があります。私の場合、何時間もかかっていたインポートが約 20 分に短縮されました。

于 2012-09-28T01:20:29.167 に答える