sql >> Databasteknik >  >> RDS >> Mysql

Importera stor CSV-fil till MySQL

försök att optimera dina skript först. För det första, kör aldrig enstaka frågor när du importerar såvida du inte har något annat val, nätverkskostnaderna kan vara en mördare.

Prova något i stil med (uppenbarligen oprövad och kodad i SO-textrutan, kontrollera att parenteser matchar e.c.t.):

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

Lek med numret i array_chunk, för stort och det kan orsaka problem som att frågan är för lång (ja det finns en konfigurerbar gräns i my.cnf), för liten och dess onödiga overhead.

Du kan också släppa användningen av att tilldela $data[x] variabler eftersom det är ett slöseri med tanke på hur litet skriptet är, använd bara $data[x] direkt i din fråga e.c.t. (kommer inte att ge en massiv förbättring, men beroende på din importstorlek kan det spara lite).

Nästa sak skulle vara att använda lågprioriterade inlägg/uppdateringar, kolla in det här för mer information om det för att komma igång:Hur prioriterar man vissa frågor?

efter allt detta kan du tänka på mysql-konfigurationsoptimering, men det är en för google att verkligen förklara eftersom de bästa inställningarna är olika för alla och deras unika situationer

Redigera: En annan sak jag har gjort tidigare är om du har många nycklar inställda som inte krävs för importen, kan du släppa dessa nycklar tillfälligt och lägga till dem igen när skriptet är klart. Detta kan också ge bra tidsförbättringar, men eftersom du arbetar med en livedatabas finns det fallgropar att komma runt om du går den vägen.



  1. Oracle-tabell dynamisk partition

  2. Kontrollera om en tabell har en TIMESTAMP-kolumn i SQL Server med OBJECTPROPERTY()

  3. Docker-bild körs i m1-processor

  4. Är det sant att jag inte kan redigera en MySQL-utlösare, jag måste släppa den och skapa en ny?