2009-09-02 27 views
2

私はテスト用に約5億行のガベージデータをデータベースに挿入しようとしています。今私はいくつかのSELECT/INSERTステートメントをそれぞれTRANSACTIONの中にループしているPHPスクリプトを持っています - これは明らかに最適な解決策ではありません。テーブルはInnoDB(行レベルのロック)です。フォークMySQL INSERT INTO(InnoDB)

私は(適切に)プロセスをフォークすれば、これがINSERTプロセスのスピードアップになるのでしょうか?それが完了するまでには140時間かかります。私は2つのことが心配です:

  1. INSERT文が書き込みロックを取得しなければならない場合は、複数のプロセスが同時に同じテーブルに書き込むことができないので、それは、役に立たないフォークレンダリングされますか?

  2. SELECT...LAST_INSERT_ID()(内はTRANSACTION)です。複数のプロセスがデータベースに入っているときにこの論理は破損しますか?私は各フォークに対して新しいデータベース接続を作成することができたので、これが問題を回避することを願っています。

  3. いくつのプロセスを使用する必要がありますか?クエリ自体はシンプルで、私は2GBのRAMを持つ通常のデュアルコアの開発ボックスを持っています。私はInnoDBを8つのスレッド(innodb_thread_concurrency=8)を使用するように設定しましたが、8つのプロセスを使用しなければならないかどうか、またはこれがマッチングについて考える正しい方法であるかどうかはわかりません。

ありがとうございました!

答えて

4

1)はい、ロック競合が発生しますが、innodbは挿入しようとする複数のスレッドを処理するように設計されています。確かに、彼らは同時に挿入しませんが、それはあなたのための挿入をシリアル化する処理します。トランザクションを具体的に終了し、できるだけ早く実行するようにしてください。これにより、最良のインサート・パフォーマンスが得られます。

2)いいえ、last_insert_id()は接続固有であるため、このロジックはスレッドごとに1つの接続があれば中断されません。

3)これは、ベンチマークで把握する必要があるものの1つです。実際には、私はプログラムを自己調整するだろう。 8つのスレッドで100個のインサートを実行し、実行時間を記録します。その後、半分の倍数と2倍の倍数で再試行してください。どちらの方が高速であれば、その数を超えるスレッドカウント値をベンチマークします。

一般的に、この種のものをベンチマークしてより速いものを確認するだけです。あなたが考えることを考え出して書く時間があれば、既に予備の数字があるかもしれません。

+0

詳細な対応をありがとうございます!懸念することはあまりないことを知ってうれしい。 – ash

7

多数のレコードを効率的に挿入するには、MySQLのマニュアルにa discussionがあります。明確な勝者はLOAD DATA INFILEコマンドの使用であり、その後に複数の値リストを挿入する挿入が続くようです。

+0

このチップをありがとう! 20倍速く、優れています。 – ash