sql >> データベース >  >> RDS >> Mysql

PHP PDOは、bindParamを使用して複数(10000以上)の同じ行を挿入します。いい練習?

    ループのすべての反復中にbindParam()を実行する必要はありません。 bindParam()により、変数$ v1、$v2などが参照によってバインドされます。 したがって、必要なのは、これらの変数の値を変更してから、クエリを再実行することだけです。これにより、オーバーヘッドを削減できます。

    また、ループを介して毎回intval()を呼び出さないようにすることもできます。 $cloneCountが整数に強制されていることを確認してください1回 、ループの前。これはごくわずかな改善ですが、良い習慣です。

    $cloneCount = (int) $cloneCount;
    
    ... 9 other bindParam
    $insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
    $insertG->bindParam(':v2', $v2, PDO::PARAM_INT);
    
    for ($i=0; $i < $cloneCount; $i++) 
    {
      $v1 = /* something */
      $v2 = /* something */
      $insertG->execute();
    }
    

    自動コミットも避ける必要があります。 明示的なトランザクションを開始することにより、ステートメント実行ごとのMySQLのトランザクションオーバーヘッドを削減します 、数千行を挿入してから、トランザクションをコミットします。

    ただし、1つのテーブルへの数千の同様の行の一括INSERTを高速化する最善の方法は、 LOAD DATA LOCAL INFILE INSERTの代わりに。これは、パラメーター、トランザクション、複数行の挿入、およびその他の考えられるトリックを使用する場合でも、行ごとのINSERTよりも10〜20倍高速に実行されます。

    PHPを使用してデータを.CSVファイルにディスクに書き込み、そのファイルでLOAD DATA LOCAL INFILEを使用する必要がある場合でも、はるかに高速です。

    INSERTステートメントの速度 も参照してください。 その他のヒントについては、MySQLマニュアルを参照してください。



    1. MySQL(パフォーマンスとストレージ)でNULL

    2. AES _Mysqlの暗号化、C#.Netの復号化

    3. JDBCとMySQLを使用した通信リンク障害の解決

    4. SQLServerの切り捨てと8192の制限