3

私は 4,000 行を含む .txt ファイルを持っています。それらを mysql に挿入しようとしています。同じことを行う 2 つのアプローチがあります。最初のアプローチは次のように単純にコーディングされています。

$start = microtime(true);
foreach($b as $k=>$v){//$b is an array of 4,000 elements
    $db->exec("INSERT INTO siji (en,cn) VALUES ('$v[0]','$v[1]')");
}
echo microtime(true)-$start;//116 sec.

116 秒かかります。2 番目の方法は PDO::bindParam() を使用することです。SQL クエリを繰り返す場合は、bindparam() を使用することをお勧めします。これは、各クエリの唯一の違いはそれらの値であるため、次のようにコーディングしたためです。 :

    $start = microtime(true);
$stmt = $db->prepare('INSERT INTO siji (en,cn) VALUES (:en,:cn)');
$stmt->bindParam(':en',$en);
$stmt->bindParam(':cn',$cn);
foreach($b as $k=>$v){//$b is an array of 4,000 elements
    $en = $v[0];
    $cn = $v[1];
    $stmt->execute();//
}
echo microtime(true)-$start;//127 sec.

2 番目のアプローチは最初のアプローチよりも高速であると思われますが、結果は私が思っていたものとは異なりますが、bindparam() は本当に一括挿入を高速化するのか教えてもらえますか? または、bindparam() を使用するときに何が間違っている可能性がありますか? ?

4

3 に答える 3

0

4,000 行を含む .txt ファイルがあります。それらを mysql に挿入しようとしています。

速度が気になる場合は、LOAD DATA INFILEを使用します。

また、4000 回の挿入で 100 秒は多すぎます。挿入をトランザクションでラップするか、innodb を偏執的でないモードに構成することを検討する必要があります。

于 2013-06-13T12:20:52.870 に答える
0

2番目のアプローチは最初のアプローチよりも高速であると思われますが、結果は私が思っていたものではありません.bindparam()は本当に一括挿入を高速化しますか?

実際はもっと速いです。あなたが投稿したような簡単なクエリでは必ずしもそうではありません。

これは、MySQL と PostgreSQL のベンチマークに少し似ています。些細な非同時選択を行う MyISAM テーブルでテストを実行すると、ベンチマークは MySQL が Postgres より優れていると判断する場合があります。ただし、数百の同時クエリを半ダースのジョインで実行すると、ベンチマークはまったく異なるストーリーを示す可能性があります。

あなたの場合、簡単な挿入を準備しています。SQL を解析するのは簡単です。最適なクエリ プランを決定することも同様に簡単です。声明を準備する利点は非常にわずかです。一方、各挿入で起動するいくつかの重要なトリガーがある場合は、非常に異なるストーリーが得られる可能性があります。

真の準備とエミュレートされた準備についても言いたいことがあります。場合によっては、準備されたステートメントが最適な計画を提供しないことがあります。次のクエリを検討してください。

select * from foo order by bar limit ?

上記を準備すると、プランナーは bar でインデックスを使用するかどうかを決定できません。bar が十分に低い場合、それは理にかなっています。巨大な場合は、テーブル全体をフェッチして上位 n ソートすることもできます。したがって、プランナーは後者のプランを選択します。

対照的に、最終的なクエリを直接送信する場合、プランナーは、その特定の値に対して同じインデックスを使用することが意味があるかどうかを判断するために必要なすべての要素を取得します。つまり、エミュレートされた準備は、1 回しか実行されないクエリや単純なクエリの場合に適している場合があります。

ああ、すべてを単一のトランザクションにラップすることを忘れないでください。それは物事を大幅にスピードアップします。

于 2013-06-13T12:22:26.693 に答える