2011-07-23 5 views
7

私はいくつかのデータをテキストファイルからMySQLデータベースにインポートするPHPスクリプトを作成しています。これらのテキストファイルはかなり大きく、平均ファイルには10,000行あり、それぞれが自分のデータベースに必要な新しい項目に対応しています。データベースのクエリをレート制限するか、減らす必要がありますか?

を(私は非常に頻繁にファイルをインポートすることはありません)私は行で、1万回をファイルから行を読み取り、その後、INSERTクエリを実行すると、いくつかの問題を引き起こすかもしれないと心配しています。私にこれをするための良い方法がありますか?すべての10,000の値を持つ1つのINSERTクエリを実行する必要がありますか?それとも、それは悪いことでしょうか?

たぶん私はメディアに到達し、一度に10のまたは100のエントリのような何かを行うことができます。本当に私の問題は、何が良い習慣であるかわからないということです。たぶん1万問のクエリが問題なく、何も心配していないだけです。

提案がありますか?

答えて

6

はい、これは速い1行1クエリのスタイルよりも、複数で1つのクエリを、行います

<?php 
$lines = file('file.txt'); 
$count = count($lines); 
$i = 0; 
$query = "INSERT INTO table VALUES "; 
foreach($lines as $line){ 
    $i++; 
    if ($count == $i) { 
     $query .= "('".$line."')"; 
    } 
    else{ 
     $query .= "('".$line."'),"; 
    } 
} 
echo $query; 

http://sandbox.phpcode.eu/g/5ade4.php

です!

+0

+1クールなもの、それのように。 – Mattis

+0

ありがとう!それは1つの大きなクエリが良いアイデアのように見えます! – nate

+3

しかし、クエリのサイズはサーバのmax_allowed_pa​​cketパラメータより小さくなければならないので注意してください! (my.iniを参照) – spacediver

2

私は一度にすべての値を持つ1つの大きなクエリでそれを行うだろう。何かが(それはかなり長い時間のための最も可能性の高い実行されているので、可能である)、クエリの実行中に問題が発生した場合、データベースがされるようにだけ、しかし、あなたが後で前START TRANSACTION;を実行し、COMMIT;作る、確かに影響を受けない。

+0

複数のインサートを発行すると、エラーを追跡するためにあなたの能力を削減することに注意してください。行の1つを挿入するために失敗した場合、あなたは – marcelog

+0

真のエラーを引き起こした(そしてもちろん、少なくとも良いものを持つのではなく、全体のバッチジョブをドロップします)どちらを検出することができる文句を言いません。私は挿入されているすべてのデータが正常だと仮定しているので、行を挿入できないはずはありません。これを確認するために、クエリ文字列にデータを追加する前に、データに対して検証を実行する必要があります。 – EdoDodo

+0

IMNSHO、トランザクション全体を失うことは、コミットされている部分的なトランザクションよりも好ましいです。検証が問題になる可能性がある場合は、たとえば、一時テーブルに最初に挿入し、競合する行の新しいデータと既存のデータを照会した後、データを転送するなど、単一のトランザクションの枠組みでこれを解決しようとします一時テーブルからメインテーブルまで、私はすべてがOKだと確信しています。これは両方の世界の中で最高のものになります(コードの複雑さはいくらかかかります) – SingleNegationElimination

5

の高性能MySQLの作成者が提案した文を使用してください。それは多くの時間を節約します(無駄なプロトコルとSQL ASCIIコードを節約します)。

+0

お元気です!私はこれが存在するようなものは何も知らなかった。私はデフするよ。私のインポートには準備済みのステートメントを使用してください。ありがとう! – nate

関連する問題