Anda tidak perlu bindParam() selama setiap iterasi dari loop. bindParam() menyebabkan variabel $v1, $v2, dll. terikat dengan referensi , jadi yang perlu Anda lakukan hanyalah mengubah nilai variabel-variabel ini, lalu menjalankan kembali kueri. Itu bisa mengurangi biaya overhead.
Anda juga dapat menghindari memanggil intval() setiap kali melalui loop. Pastikan $cloneCount dipaksa ke integer sekali , sebelum lingkaran. Itu adalah peningkatan yang sangat kecil, tetapi ini adalah praktik yang baik.
$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();
}
Anda juga harus menghindari komit otomatis. Kurangi overhead transaksi MySQL per eksekusi pernyataan dengan memulai transaksi eksplisit , menyisipkan beberapa ribu baris, lalu melakukan transaksi.
Tetapi cara terbaik untuk mempercepat INSERT massal dari ribuan baris serupa ke satu tabel adalah dengan menggunakan MUAT INFILE LOKAL DATA bukannya INSERT. Ini berjalan 10-20x lebih cepat daripada INSERT baris demi baris, bahkan jika Anda menggunakan parameter, transaksi, penyisipan multi-baris, dan trik lain yang dapat Anda pikirkan.
Bahkan jika Anda harus menggunakan PHP untuk menulis data Anda ke dalam file .CSV ke disk dan kemudian menggunakan LOAD DATA LOCAL INFILE pada file itu, itu masih jauh lebih cepat.
Lihat juga Kecepatan Pernyataan INSERT di manual MySQL untuk tips lainnya.