Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PHP PDO insere várias (10.000+) mesmas linhas usando bindParam. Boa prática?


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.