Mysql
 sql >> Database >  >> RDS >> Mysql

Importa file CSV di grandi dimensioni in MySQL

prova prima a ottimizzare i tuoi script. Prima di tutto, non eseguire mai query singole durante l'importazione a meno che tu non abbia altra scelta, il sovraccarico della rete può essere un killer.

Prova qualcosa del tipo (ovviamente non testato e codificato nella casella di testo SO, controlla che le parentesi corrispondano ecc.):

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

Gioca con il numero in array_chunk, troppo grande e potrebbe causare problemi come la query troppo lunga (sì, c'è un limite configurabile in my.cnf), troppo piccolo e il suo sovraccarico non necessario.

Potresti anche eliminare l'uso di assegnare $data[x] alle variabili poiché è uno spreco dato quanto è piccolo lo script, basta usare $data[x] direttamente nella tua query e.c.t. (non darà un enorme miglioramento, ma a seconda delle dimensioni dell'importazione potrebbe risparmiare un po').

La prossima cosa sarebbe usare inserimenti/aggiornamenti a bassa priorità, controlla questo per maggiori informazioni su questo per iniziare:Come dare priorità a determinate query?

dopo tutto ciò, potresti pensare all'ottimizzazione della configurazione di mysql, ma questa è una cosa che Google può spiegare davvero perché le impostazioni migliori sono diverse per tutti e per le loro situazioni uniche

Modifica: Un'altra cosa che ho fatto in precedenza è che se hai impostato molte chiavi che non sono necessarie per l'importazione, puoi rilasciare quelle chiavi temporaneamente e aggiungerle di nuovo al termine dello script. Questo può anche produrre buoni miglioramenti temporali, ma poiché stai lavorando su un database live ci sono delle insidie ​​da aggirare se segui quella strada.