Не е необходимо да свързвате Param() по време на всяка итерация на цикъла. BindParam() кара променливите $v1, $v2 и т.н. да бъдат обвързани чрез препратка , така че всичко, което трябва да направите, е да промените стойностите на тези променливи и след това да изпълните отново заявката. Това може да намали режийните разходи.
Също така можете да избегнете извикването на intval() всеки път през цикъла. Просто се уверете, че $cloneCount е принуден до цяло число веднъж , преди цикъла. Това е много незначително подобрение, но е добра практика.
$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 за изпълнение на оператор, като стартирате изрична транзакция , вмъкване на няколко хиляди реда и след това извършване на транзакцията.
Но най-добрият начин да ускорите груповото INSERT от хиляди подобни редове в една таблица е да използвате ЗАРЕЖДАНЕ НА ЛОКАЛЕН ИНФАЙЛ НА ДАННИ вместо INSERT. Това работи 10-20 пъти по-бързо от INSERT ред по ред, дори ако използвате параметри, транзакции, многоредово вмъкване и всеки друг трик, за който се сетите.
Дори ако трябва да използвате PHP, за да запишете данните си в .CSV файл на диска и след това да използвате LOAD DATA LOCAL INFILE върху този файл, пак е много по-бързо.
Вижте също Скорост на инструкциите INSERT в ръководството на MySQL за повече съвети.