2011-07-23 10 views
7

Estoy creando un script PHP que importa algunos datos de archivos de texto en una base de datos MySQL. Estos archivos de texto son bastante grandes, un archivo promedio tendrá 10.000 líneas, cada una de las cuales corresponde a un nuevo elemento que quiero en mi base de datos. (No importaré archivos muy a menudo)¿Debo limitar o reducir las consultas de mi base de datos?

Me preocupa que leer una línea del archivo y luego hacer una consulta INSERT, 10.000 veces seguidas podría causar algunos problemas. ¿Hay una mejor manera de hacer esto? ¿Debo realizar una consulta INSERT con todos los 10,000 valores? ¿O eso sería igual de malo?

Quizás pueda alcanzar un medio y realizar algo así como 10 o 100 entradas a la vez. Realmente mi problema es que no sé qué es una buena práctica. Tal vez 10.000 consultas seguidas están bien y solo me preocupo por nada.

¿Alguna sugerencia?

Respuesta

6

sí es

<?php 
$lines = file('file.txt'); 
$count = count($lines); 
$i = 0; 
$query = "INSERT INTO table VALUES "; 
foreach($lines as $line){ 
    $i++; 
    if ($count == $i) { 
     $query .= "('".$line."')"; 
    } 
    else{ 
     $query .= "('".$line."'),"; 
    } 
} 
echo $query; 

http://sandbox.phpcode.eu/g/5ade4.php

esto hará que una sola consulta, que se destacan por un estilo más rápido que una línea-una-consulta!

+0

+1 Cosas interesantes, me gusta. – Mattis

+0

gracias! ¡Parece que una consulta más grande es una buena idea! – nate

+3

¡Pero tenga cuidado, porque el tamaño de la consulta debe ser menor que su parámetro max_allowed_packet para el servidor! (ver my.ini) – spacediver

2

Lo haría en una consulta grande con todos los valores a la vez. Sin embargo, para estar seguro, asegúrese de ejecutar START TRANSACTION; antes y COMMIT; después, de modo que si algo sale mal durante la ejecución de la consulta (que es posible, ya que probablemente se ejecutará durante bastante tiempo), la base de datos no ser afectado

+0

tenga en cuenta que emitir una inserción múltiple reducirá su capacidad para rastrear errores. si una de las filas no se puede insertar, no podrá detectar cuál desencadenó el error (y, por supuesto, eliminará todo el trabajo por lotes en lugar de al menos tener los buenos) – marcelog

+0

Verdadero. Supongo que todos los datos que se insertan están en buen estado, por lo que no debería fallar insertar ninguna fila. La validación se debe realizar en los datos antes de que se agregue a la cadena de consulta para asegurarse de esto. – EdoDodo

+0

IMNSHO, perder toda la transacción es preferible a una transacción parcial comprometida. Si es probable que la validación sea un problema, trataría de resolver eso en el marco de una sola transacción, por ejemplo, insertando primero en una tabla temporal, consultando entre los datos nuevos y los existentes para filas en conflicto, y luego transfiriendo datos. de la mesa temporal a la mesa principal una vez que estoy seguro de que todo está bien. esto sería lo mejor de ambos mundos (a costa de una complejidad de código un poco mayor) – SingleNegationElimination

5

Utilice declaraciones preparadas, sugeridas por los autores de Alto rendimiento MySQL. Se ahorra mucho tiempo (se ahorra a partir del protocolo inútil y el código SQL ASCII).

+0

¡Qué bueno! No tenía idea de que existiera algo así.Definitivamente. usar declaraciones preparadas para mi importación. ¡Gracias! – nate

Cuestiones relacionadas