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

Importer stor CSV-fil til MySQL

prøv at optimere dine scripts først. For det første, kør aldrig enkeltforespørgsler, når du importerer, medmindre du ikke har noget andet valg, netværksomkostningerne kan være en dræber.

Prøv noget i stil med (åbenbart utestet og kodet i SO-tekstboksen, tjek parenteser match 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);
}

Leg med tallet i array_chunk, for stort, og det kan forårsage problemer, såsom at forespørgslen er for lang (ja, der er en konfigurerbar grænse i my.cnf), for lille og dens unødvendige overhead.

Du kan også droppe brugen af ​​at tildele $data[x] til variabler, da det er spild i betragtning af hvor lille scriptet er, bare brug $data[x] direkte i din forespørgsel e.c.t. (vil ikke give en massiv forbedring, men afhængigt af din importstørrelse kan det spare lidt).

Næste ting ville være at bruge lavprioritetsindlæg/opdateringer, tjek dette for mere info om det for at komme i gang:Hvordan prioriterer man visse forespørgsler?

efter alt dette kunne du tænke på mysql-konfigurationsoptimering, men det er en for Google at forklare, da de bedste indstillinger er forskellige for alle og deres unikke situationer

Rediger: En anden ting, jeg har gjort før, er, at hvis du har sat mange nøgler op, som ikke er nødvendige for importen, kan du slippe disse nøgler midlertidigt og tilføje dem igen, når scriptet er færdigt. Dette kan også give gode tidsforbedringer, men da du arbejder på en live database, er der faldgruber at komme udenom, hvis du går den vej.



  1. Macports mysql5 opsætning under Snow Leopard

  2. mysql-forespørgsel for at matche sætning mod søgeord i et felt

  3. Hvornår skal du bruge TEXT i mysql i stedet for VARCHAR

  4. Kan ikke udstede datamanipulationserklæringer med executeQuery()