sql >> Databáze >  >> RDS >> Mysql

Importujte velký soubor CSV do MySQL

zkuste nejprve optimalizovat své skripty. Za prvé, nikdy při importu nespouštějte jednotlivé dotazy, pokud nemáte jinou možnost, režie sítě může být zabijákem.

Zkuste něco jako (samozřejmě netestováno a zakódováno v textovém poli SO, zkontrolujte shodu závorek atd.):

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

Pohrajte si s číslem v array_chunk, které je příliš velké a může způsobit problémy, jako je příliš dlouhý dotaz (ano, v my.cnf je konfigurovatelný limit), příliš malý a zbytečná režie.

Můžete také upustit od používání přiřazení $data[x] k proměnným, protože je to zbytečné vzhledem k tomu, jak malý je skript, stačí použít $data[x] přímo ve svém dotazu atd. (neposkytne výrazné zlepšení, ale v závislosti na velikosti importu by to mohlo trochu ušetřit).

Další věcí by bylo použít vložky/aktualizace s nízkou prioritou, podívejte se na toto, kde najdete další informace, abyste mohli začít:Jak udělit prioritu určitým dotazům?

po tom všem byste mohli uvažovat o optimalizaci konfigurace mysql, ale to by měl google vysvětlit, protože nejlepší nastavení se liší pro každého a jeho jedinečné situace

Upravit: Další věc, kterou jsem udělal dříve, je, že pokud máte nastaveno mnoho klíčů, které nejsou nutné pro import, můžete tyto klíče dočasně vypustit a přidat je zpět, až bude skript hotový. To může také přinést dobré zlepšení času, ale při práci na živé databázi existují úskalí, která je třeba obejít, pokud se vydáte touto cestou.



  1. Název tabulky jako parametr funkce PostgreSQL

  2. MySQL - Jak spojit dvě tabulky bez duplikátů?

  3. Vrácení sady výsledků

  4. Nejlepší způsob, jak resetovat sekvenci Oracle na další hodnotu v existujícím sloupci?