Você não precisa bindParam() durante cada iteração do loop. O bindParam() faz com que as variáveis $v1, $v2, etc. sejam vinculadas por referência , então tudo o que você precisa fazer é alterar os valores dessas variáveis e, em seguida, executar novamente a consulta. Isso poderia reduzir a sobrecarga.
Além disso, você pode evitar chamar intval() toda vez que passar pelo loop. Apenas certifique-se de que $cloneCount seja forçado a inteiro uma vez , antes do laço. Essa é uma melhoria muito pequena, mas é uma boa prática.
$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();
}
Você também deve evitar o autocommit. Reduza a sobrecarga de transação do MySQL por execução de instrução iniciando uma transação explícita , inserindo vários milhares de linhas e confirmando a transação.
Mas a melhor maneira de acelerar o INSERT em massa de milhares de linhas semelhantes em uma única tabela é usar CARREGAR INFIL LOCAL DE DADOS em vez de INSERIR. Isso é executado de 10 a 20 vezes mais rápido do que INSERT linha por linha, mesmo se você usar parâmetros, transações, inserção de várias linhas e qualquer outro truque que você possa imaginar.
Mesmo se você tiver que usar PHP para gravar seus dados em um arquivo .CSV no disco e então usar LOAD DATA LOCAL INFILE nesse arquivo, ainda é muito mais rápido.
Veja também Velocidade das instruções INSERT no manual do MySQL para mais dicas.