ループのすべての反復中に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マニュアルを参照してください。