2016-04-26 2 views
0

2つのヒントがあります: 1.ファイルを読み込んでデータベースにデータを挿入するためにPHPを使用します。 2. LOAD DATA INFILEのSQL文を使用してファイルを読み取り、データをデータベースに挿入します。 結果は、ヒントを完了するのに多くの時間が必要だが、ヒント2は完了するまでに数秒しか要しないということです。 質問は、2つのヒントの違いは何ですか? phpとsqlの基本的な設計や理論の原則について教えてください。 それがあれば、それは何ですか?phpとsqlの違いは?

+0

PHPのバージョンは5.3であり、データベースのタイプは、MySQLであり、そして5.5バージョンよりも早くなければならないインサート何のわずか数であります。 – James

答えて

0

私はここsemiliar質問への答えが見つかりました: https://dba.stackexchange.com/questions/16809/why-is-load-data-infile-faster-than-normal-insert-statements

PHPの使用INSERT文は、データベースにデータを追加するには、それがデータベースへの接続のためのaddential層を使用します。それは待ち時間を生む。

SQL INSERTは高速ではなく、PHPでは、それは付加層を必要としないためです。最後に上記の質問で、なぜLOAD DATA INFILE速くそれはINSERT

+0

ok、thks。私は今それを見ています。 – James

0

それはあなたがPHPのバージョンをやっている方法によって異なります。さまざまなレベルのパフォーマンスを備えたいくつかのオプションがあります。

Doctrineまたは PropelのようなORMを使用すると、各レコードを詳細に制御でき、フレンドリーなインターフェイスが公開されますが、最も遅いアプローチです。通常、各レコードは検証されるので、そのセキュリティはありますが、データがすでにわかっている場合は良い方法があります。

ORMまたはPDOなどで提供されているRAWデータベースアダプタを使用すると、通常、準備された文を使用して、異なるデータ値で同じINSERT文を繰り返し実行することができます。

最も効率的なPHPドリブンな方法は、複数の値セット、いわゆる「マルチインサート」を使用して大文字のINSERT文を作成することです。これは通常、一度に1000行以上のチャンクでデータを追加する方法ですそれぞれの行は大きくなります。適切なサーバチューニングを行うことで、これのパフォーマンスが最適に近づき、理論上最速の30-50%のペナルティを支払う可能性があります。時にはこれは合理的なトレードオフです。

LOAD DATA INFILEのアプローチは、MySQLが内部的な最適化を処理するために、常に最速になります。これは、データベースサーバー上にファイルを直接読み取ることができるようにするため、最も制限的なものです。また、データが正しいことを確認し、スキーマに収まるかどうか、または意図しない切り捨てが発生する可能性があります。データ検証は行われず、無効な日付は0000-00-00などの問題を引き起こす可能性があります。

これらのアプローチはすべて状況によって異なります。速度が必要な場合は、LOAD DATAの方法が常に最速になりますが、リスクがないわけではありません。

PHPを式から削除すると、オーバーヘッドが減少します。ディスク上のファイルを使用すると、ネットワークスタックとMySQLネットワークプロトコルのオーバーヘッドが回避されます。これらの2つは、コストをかなり低く抑えていますが、非常に高速に実行できるシステムに膨大な量のデータを挿入しようとしているときに特に覚えておくことが重要です。

+0

phpのバージョンは5.3です。 – James

+0

phpがすべての文を検証することを意味しますか? – James

+0

ORMは、名前が入力されたことを確認するか、パスワードに数字が入っているかのような処理を行います。ダーティデータを処理する際に重要なことです。低レベルのPHPは多くのバリデーションを行いませんが、エンコードとエスケープを行う必要があります。ファイルからはほとんど生のままですが、ほとんど処理が適用されません。 – tadman

1

最初の方法では、phpコードは挿入しようとしているすべての値を検証します。e)番号の値を挿入する場合は純粋な番号かどうかチェックします(使用しているスクリプトのプログラミングロジックに依存します)

ヒント1で説明したように、データベースに挿入し、データベースへの接続を取得する必要があります。 接続を取得した後、文を実行する必要があります(上記の解析は、データベースサーバのコーディングロジックに従って)オーバーヘッドに追加されます。

PHPはすべての挿入ステートメントをデータベースサーバーに送信します(挿入アルゴリズムの場合)。そしてそれはアプリケーションサーバーデータベースサーバーアプリケーションサーバーロジックは、より多くの遅延を追加します。 DBサーバの場合

それがよりそれがPHP

+0

バリデーションについての発言は必ずしも正しいとは限りませんが、多くのPHPプログラムは、MySQLをそのままにしておくと、エスケープしてワイヤーで発火させるだけです。 – tadman

+0

私はそれがphpスクリプトの設計ロジック上のすべてのdepents、それよりも、アプリケーションサーバーにデータベースサーバーにappserverは、PHPの挿入にいくつかの頭を追加する –

+0

その理由は、PHPがデータベースに接続する必要があります作成するすべての単一のinsert文のためのすべての単一のスレッド?しかし、私は一緒に挿入ステートメントに参加し、それはまだexcuteに多くの時間が必要です。 – James