2012-03-09 11 views
5

私は急速に成長している書き込み負荷の高いPHP/MySqlアプリケーションを使用して、数十万行のINNODBテーブルに1秒間に12個程度の新しい行を挿入します。MySql INSERT vs PHP file_put_contents

リアルタイムのINSERT文を使い始めてから、PHPのfile_put_contentsに移動してファイルにエントリを書き込み、LOAD DATA INFILEを実行してデータベースにデータを取得しました。どちらが良いアプローチですか?

私は考慮すべき選択肢はありますか? 2つの方法が将来の衝突や負荷の増加をどのように処理すると思いますか?

ありがとうございます!

+0

代替方法の1つは、メインテーブルへの書き込みが問題になる場合に、セカンダリテーブルに書き込んだり、一括してメインテーブルに挿入したりすることです。 –

答えて

3

データを挿入する一括方式としてLOAD DATA INFILEを考えてください。これは、すべてのステートメントの挿入クエリを起動するオーバーヘッドをなくすため、はるかに高速です。ただし、エラーを処理するときには、コントロールの一部を失います。単一の挿入クエリでエラーを処理するほうが、ファイルの途中で1行を扱うほうがずっと簡単です。

+0

構文insertをテーブル値(row1)、(row2)、...、(rowN)に使用できます。 1つのクエリで必要なだけ多くの行を挿入できます。また、 "...重複するキーの更新..."を追加して、ユニークなキーの衝突を処理する方法を指定することもできます – atxdba

+0

@atxdba大型の挿入物では恐ろしいアイデアです。 – feketegy

+0

@feketegy恐ろしい?パフォーマンス? http://tinyurl.com/7jmzbcp SOのポストは、それがより良く好まれている方法を明らかにしていますか? 1つのインサートにいくつかのギグのデータをロードしたくないということは許されますが、恐ろしいことにブランケットは定義されていません。 mysqldumpはデフォルトでバッチ挿入を作成します。あなたが本当に大量のデータロードセットについて言えば、負荷データはより良いものになるでしょう、私はそれを主張しません。私は本当に利用可能な構文を指摘していました。 – atxdba

0

私たちがインサートを処理する方法は、それらをActiveMQのようなメッセージキューシステムに送ることです。そこから、LOAD DATA INFILEを使用して約5000のバッチでインサートをロードするアプリケーションが別途用意されていますが、エラー処理はインコールでも実行できますが、インサートの処理はずっと高速です。メッセージキューの設定がアプリケーションの範囲外である場合、file_put_contentsが受け入れ可能なオプションではない理由はありません。特に、すでに実装されていてうまく動作している場合です。

また、書き込み中に無効化インデックスをテストして、パフォーマンスが向上するかどうかを確認することもできます。

+0

インデックスを無効にすることについての良い点 - ありがとうございました – user1259956

+0

もう1つのポイントは、特定のシステムのボトルネックがどこにあるかです。 iostatとvmstatを使用して、減速がどこにあるのか、どこに力を集中させるべきかを判断してください。あなたのデータを使って何をしているかによって、ストレージのための多くのソリューションがあります。 – RumpRanger

0

innoDBを使用する必要があるように聞こえません。それにもかかわらず、おそらくデータモデルが非常に複雑な場合を除き、恐ろしいハードウェアの場合でも1秒あたり12個の挿入が問題になるはずはありませんが、LOAD DATA INFILEは非常に優れています。すべてのインサートではなく、だから、ファイルを使うのはまともなアプローチですが、追加専用モードでファイルを開くようにしてください。

長期間(1k +書き込み/秒)、他のデータベース、特に書き込み重いアプリケーションのためのcassandraを見てください。

+0

インデックス作成も私の心の中にありました。書き込みごとに高速化される - フラットファイルに追加するか、データベースに挿入するか?同時リクエストをどのように処理しますか? – user1259956

+0

それは本当に依存して、テストを実行し、あなたの環境のためにそれを把握する必要があります。ファイルに追加することは、制限内にデータを保持すると原子にしかなりません(私はLinux上で4Kと信じています)、o/wでは並行性に問題があります – miki

2

PHPによって挿入されたデータをテーブルですぐに利用できないかどうかによって、INSERT DELAYEDがオプションになる可能性があります。

MySQLはデータの挿入を受け付け、後で挿入を処理してキューに入れます。これにより、PHPアプリケーションをブロックすることはできませんが、MySQLは後でデータを挿入することを保証します。

As it says in the manual:

DELAYED INSERTを使用してのもう一つの大きな利点は、多くのクライアントからの挿入を束ねて1つのブロックに書かれているということです。これは、多くの個別のインサートを実行するよりもはるかに高速です。私は、データの損失は致命的ではありませんが、あなたがINSERT DELAYEDからのデータがまだ挿入されていない場合に、サーバーがクラッシュしたから保護したい場合は、あなたが離れて変更を複製するに見ることができるログデータのためにこれを使用している

専用のスレーブ機。

0

sqlの挿入ルートを実行する場合は、pdo execute文をトランザクション内にラップします。そうすることでプロセスが大幅にスピードアップします。