sql >> データベース >  >> RDS >> Mysql

大きなCSVファイルをMySQLにインポートする

    最初にスクリプトを最適化してみてください。まず、他に選択肢がない場合を除いて、インポート時に単一のクエリを実行しないでください。ネットワークのオーバーヘッドがキラーになる可能性があります。

    次のようなものを試してください(明らかにテストされておらず、SOテキストボックスにコード化されています。角かっこが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);
    }
    

    array_chunkの数値を試してみてください。大きすぎると、クエリが長すぎる(my.cnfに構成可能な制限があります)、小さすぎる、不要なオーバーヘッドなどの問題が発生する可能性があります。

    スクリプトが非常に小さいことを考えると、変数に$ data [x]を割り当てる使用をやめることもできます。たとえば、クエリで$data[x]を直接使用するだけです。 (大幅な改善はありませんが、インポートサイズによっては少し節約できます)。

    次に、優先度の低い挿入/更新を使用します。開始するには、これをチェックして詳細を確認してください:特定のクエリに優先順位を付ける方法は?

    結局のところ、mysql構成の最適化について考えることができますが、最適な設定はすべての人とその固有の状況によって異なるため、これはgoogleが実際に説明するものです

    編集: 私が以前に行ったもう1つのことは、インポートに必要のないキーが多数設定されている場合、それらのキーを一時的に削除して、スクリプトが完了したときに追加し直すことができることです。これにより、時間も大幅に改善できますが、ライブデータベースで作業する場合、そのルートをたどると回避すべき落とし穴があります。



    1. $ stmt-> close()vs $ stmt-> free_result()

    2. データベースの外部キー/主キーとしてのVARCHARは良いですか、悪いですか?

    3. 1つのクエリでグループ化、並べ替え、カウント

    4. WampServer-MSVCR120.dllが見つからないため、mysqld.exeを起動できません