sql >> Database >  >> RDS >> Mysql

Importeer een groot CSV-bestand in MySQL

probeer eerst je scripts te optimaliseren. Ten eerste:voer nooit enkele query's uit tijdens het importeren, tenzij u geen andere keuze heeft, de netwerkoverhead kan een moordenaar zijn.

Probeer iets als (uiteraard niet getest en gecodeerd in het SO-tekstvak, controleer of de haakjes overeenkomen enz.):

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

Speel wat met het getal in array_chunk, te groot en het kan problemen veroorzaken, zoals een te lange zoekopdracht (ja, er is een configureerbare limiet in my.cnf), te klein en onnodige overhead.

Je zou ook het gebruik van het toewijzen van $data[x] aan variabelen kunnen laten vallen, aangezien het zonde is, gezien hoe klein het script is, gebruik gewoon $data[x] rechtstreeks in je query, enz. (geeft geen enorme verbetering, maar afhankelijk van uw importgrootte kan het een beetje besparen).

Het volgende zou zijn om inserts/updates met lage prioriteit te gebruiken, bekijk dit voor meer informatie hierover om u op weg te helpen:Hoe geef ik prioriteit aan bepaalde zoekopdrachten?

na dat alles zou je kunnen denken aan mysql-configuratie-optimalisaties, maar dat is er een voor Google om uit te leggen, want de beste instellingen zijn voor iedereen anders en voor hun unieke situaties

Bewerken: Een ander ding dat ik eerder heb gedaan, is dat als je veel sleutels hebt ingesteld die niet nodig zijn voor het importeren, je die sleutels tijdelijk kunt laten vallen en ze weer kunt toevoegen wanneer het script klaar is. Dit kan ook goede tijdsverbeteringen opleveren, maar aangezien u aan een live database werkt, zijn er valkuilen die u moet omzeilen als u die route bewandelt.



  1. OVER-clausule in Oracle

  2. Geavanceerde failover met behulp van post/pre-script hooks

  3. MySQL NET Connect 6.7.2 in Visual Studio 2012

  4. Fout wanneer ik probeer verbinding te maken met mysql 5.5