巨大なデータソース(20GBの生のテキスト)を掘り起こし、単純な空白のテーブル(1つの主キーを持つ4つの整数列)で実行するINSERTのロードを生成するCプログラムがあります。 MEMORY
テーブルとして設定すると、タスク全体が8時間で完了します。終了後、テーブルには約1億5,000万行が存在します。 8時間は私にとって完全にまともな数字です。これは1回限りの取引です。大規模な150M行MySQLテーブルの生成
テーブルをMyISAM
に変換しようとすると、(A)他のプロセス用にメモリを解放し、(B)コンピュータを再起動してもデータが消去されないようにするときに問題が発生します。
ALTER TABLE memtable ENGINE = MyISAM
私は今、2日間にわたるこのALTER TABLE
クエリ実行させてきた、そしてそれが行われていません。私は今それを殺しました。
テーブルをMyISAMとして最初に作成すると、書き込み速度が非常に悪いように見えます(特に、クエリでON DUPLICATE KEY UPDATE
テクニックを使用する必要があるため)。一時的にキーをオフにすることはできません。テーブルを1000倍以上大きくすると、キーを再処理して基本的にGROUP BYを150,000,000,000行で実行する必要があります。うーん、いいえ。
実現する重要な制約の1つ:主キー(ハッシュ)がすでにテーブルに存在する場合は、INSERTクエリのUPDATEレコードです。
MyISAMを厳密に使用しようとする試みの冒頭で、毎秒1,250行の大雑把な速度が得られます。インデックスが成長すると、私はこの金利がさらに上昇すると考えています。
私はマシンに16GBのメモリを搭載しています。ディスク上のインデックス付きMyISAMテーブルとして最終的に終わる膨大なテーブルを生成する最適な方法は何ですか?
明確化:クエリ(INSERT ... ON DUPLICATE KEY UPDATE val=val+whatever
)から起こって、多くの、多くのアップデートがあります。これは決して、生のダンプの問題ではありません。最初にMEMORY
テーブルを試してみる理由は、すべてのINSERTで発生するすべてのインデックス検索とテーブル変更を高速化するためでした。
InnoDBは問題ありません。これはとても巧妙です...私はそれが好きです。私にコメントを投げてくれてありがとう。それは有り難いです。 :) – brianreavis