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

Importar archivo CSV grande en MySQL

intente optimizar sus scripts primero. En primer lugar, nunca ejecute consultas únicas al importar a menos que no tenga otra opción, la sobrecarga de la red puede ser mortal.

Pruebe algo como (obviamente no probado y codificado en el cuadro de texto SO, verifique que los corchetes coincidan, etc.):

$url = 'http://www.example.com/directory/file.csv';
if (($handle = fopen($url, "r")) !== FALSE) 
{
fgetcsv($handle, 1000, ",");

$imports = array();

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{
    $EvID = $data[0];
    $Ev = $data[1];
    $PerID = $data[2];
    $Per = $data[3];
    $VName = $data[4];
    $VID = $data[5];
    $VSA = $data[6];
    $DateTime = $data[7];
    $PCatID = $data[8];
    $PCat = $data[9];
    $CCatID = $data[10];
    $CCat = $data[11];
    $GCatID = $data[12];
    $GCat = $data[13];
    $City = $data[14];
    $State = $data[15];
    $StateID = $data[16];
    $Country = $data[17];
    $CountryID = $data[18];
    $Zip = $data[19];
    $TYN = $data[20];
    $IMAGEURL = $data[21];
    $URLLink = $data[22];

        $data[7] = strtotime($data[7]);
        $data[7] = date("Y-m-d H:i:s",$data[7]);

    if((($PCatID == '2') && (($CountryID == '217') or ($CountryID == '38'))) || (($GCatID == '16') or ($GCatID == '19') or ($GCatID == '30') or ($GCatID == '32'))) 
    {

    $imports[] = "('".md5($EventID.$PerformerID)."','".addslashes($data[0])."','".addslashes($data[1])."','".addslashes($data[2])."','".addslashes($data[3])."','".addslashes($data[4])."',
                    '".addslashes($data[5])."','".addslashes($data[6])."','".addslashes($data[7])."','".addslashes($data[8])."','".addslashes($data[9])."',
                '".addslashes($data[10])."','".addslashes($data[11])."','".addslashes($data[12])."','".addslashes($data[13])."','".addslashes($data[14])."',
                    '".addslashes($data[15])."','".addslashes($data[16])."','".addslashes($data[17])."','".addslashes($data[18])."','".addslashes($data[19])."',
                '".addslashes($data[20])."','".addslashes($data[21])."')";



    }
}

$importarrays = array_chunk($imports, 100);
foreach($importarrays as $arr) {

 if(!mysql_query("INSERT IGNORE INTO TNDB_CSV2 
                (id, EvID, Event, PerID, Per, VName,
                     VID, VSA, DateTime, PCatID, PCat,                
                CCatID, CCat, GCatID, GCat, City,
                     State, StateID, Country, CountryID, Zip,
                TYN, IMAGEURL) VALUES ".implode(',', $arr)){

     die("error: ".mysql_error());

 }

 }

fclose($handle);
}

Juega con el número en array_chunk, demasiado grande y puede causar problemas como que la consulta sea demasiado larga (sí, hay un límite configurable en my.cnf), demasiado pequeño y su sobrecarga innecesaria.

También puede descartar el uso de asignar $ data [x] a las variables, ya que es un desperdicio dado lo pequeño que es el script, simplemente use $ data [x] directamente en su consulta, etc. (no dará una gran mejora, pero dependiendo del tamaño de su importación podría ahorrar un poco).

Lo siguiente sería usar inserciones/actualizaciones de baja prioridad, consulte esto para obtener más información al respecto para comenzar:¿Cómo dar prioridad a ciertas consultas?

después de todo eso, podría pensar en la optimización de la configuración de mysql, pero eso es algo que Google debe explicar realmente, ya que las mejores configuraciones son diferentes para todos y sus situaciones únicas

Editar: Otra cosa que he hecho antes es que si tiene muchas claves configuradas que no son necesarias para la importación, puede quitar esas claves temporalmente y volver a agregarlas cuando termine el script. Esto también puede generar buenas mejoras en el tiempo, pero como está trabajando en una base de datos en vivo, hay dificultades para solucionar si sigue esa ruta.