sql >> Base de Datos >  >> RDS >> Mysql

PHP PDO inserta múltiples (10000+) filas iguales usando bindParam. ¿Buena práctica?

No necesita bindParam() durante cada iteración del ciclo. bindParam() hace que las variables $v1, $v2, etc. se vinculen por referencia , por lo que todo lo que necesita hacer es cambiar los valores de estas variables y luego volver a ejecutar la consulta. Eso podría reducir los gastos generales.

También puede evitar llamar a intval() cada vez que pasa por el ciclo. Solo asegúrese de que $cloneCount esté forzado a un número entero una vez , antes del bucle. Esa es una mejora muy pequeña, pero es una buena práctica.

$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();
}

También debe evitar la confirmación automática. Reduzca la sobrecarga de transacciones de MySQL por ejecución de instrucción al iniciar una transacción explícita , insertando varios miles de filas y luego confirmando la transacción.

Pero la mejor manera de acelerar la INSERCIÓN masiva de miles de filas similares en una sola tabla es usar CARGAR ARCHIVO LOCAL DE DATOS en lugar de INSERTAR. Esto se ejecuta de 10 a 20 veces más rápido que INSERTAR fila por fila, incluso si usa parámetros, transacciones, inserción de varias filas y cualquier otro truco que se le ocurra.

Incluso si tiene que usar PHP para escribir sus datos en un archivo .CSV en el disco y luego usar LOAD DATA LOCAL INFILE en ese archivo, aún es mucho más rápido.

Consulte también Velocidad de las instrucciones INSERT en el manual de MySQL para obtener más consejos.