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

このSQL挿入PHPコードを最適化する方法は?

    どうもありがとうございました tadman およびHanletEscaño および Uueerdo および Julie Pelletier および Solarflare コメントで私を助けてくれて。

    コメントで提案したアプローチを使用して、PHPコードに3つの異なる変更を加えた後、結果をテストしました。テスト結果は次のとおりです。

    3つのテストの結論: tadmanが示唆したように、キーはデータファイルの読み込み 。実行時間が7秒未満に劇的に短縮され、これらが3つのテストです。

    元のコード: 〜26分

    テスト1: 〜34分

    Uueerdo として echoを削除することを提案しました ステートメントとループからの行カウンター)

    while(!feof($filehandle)){
    // $x++; // commented out
    //echo $x . ":  "; // commented out
    $fileline = fgets($filehandle);
    $fields = explode("\t", $fileline);
    $query = "INSERT INTO products(hs,arabicname,englishname) VALUES(" . "'" . str_replace("'", ".", $fields[0]) ."'," . "'". str_replace("'", ".", $fields[1]) . "'," . "'". str_replace("'", ".", $fields[2]) . "');"; 
    $result = $conn->query($query); 
    /* // commented out
    if(!$result) {echo  $conn->error . "</br>";}
    }else{echo $result . "</br>";}
    */};
    

    テスト2: 〜7秒

    tadman として LOAD DATAINFILE を検索したとのことです とてもパワフルでした

    //replace the entire loop with this simple query
    $query = "LOAD DATA LOCAL INFILE'" . 
    addslashes("C:\\xampp\\htdocs\\bots\\impandexp\\imports.txt")
    . "' INTO TABLE imports FIELDS TERMINATED BY '\t' LINES TERMINATED BY
    '\r\n'(product_hs,counteryname,units,weight,value) SET  year = '2014';";
     $result = $conn->query($query);
    

    テスト3: 〜5秒

    テスト2と同じですが、tadmanが提供する同じページで、速度を最大化するのに役立つヒントを見つけました。

    InnoDBテーブルのバルクデータの読み込み

    // turning off index checks that might slows down bulk data insertion
    $query = "SET foreign_key_checks=0;";
    $conn->query($query);
    $query = "SET unique_checks=0;";
    $conn->query($query);
    $query ="SET autocommit=0;";
    $conn->query($query);
    
    $query = "LOAD DATA LOCAL INFILE'" . addslashes("C:\\xampp\\htdocs\\bots\\impandexp\\imports.txt") . "' INTO TABLE imports FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'(product_hs,counteryname,units,weight,value) SET  year = '2014';";
    $result = $conn->query($query);
    echo $result . "</br>";
    // turning them on again
    $query = "SET foreign_key_checks=1;";
    $conn->query($query);
    $query = "SET unique_checks=1;";
    $conn->query($query);
    $query ="COMMIT;";
    $conn->query($query);
    



    1. SQL更新は、更新の実行中にサブクエリに影響しますか?

    2. Mysql:ドットの後に特定の数を超える小数点が含まれるすべての行を取得する方法

    3. MySQLgroupbyおよびmaxが間違った行を返す

    4. ホット再デプロイとOracleデータベースによるPermgenメモリリーク