2

テキストファイルから解析された大量のデータを挿入するために、さまざまな方法を試しました(サーバーでは、約2秒で200,000行のテキストが配列に解析されるため、一部が問題ではないことがわかります)。私が使用しているmysqli_multi_queryは、5,000のブロックでクエリを送信します(multi_queryを複数回使用したい場合は、何らかの理由でそれ以上のクエリを拒否します)。または、テキストファイルを50,000行に分割すると、すべてを挿入できます。 2秒で一度に。それを行うと、別のクエリの実行を拒否します((mysqli_more_results($ db)&& mysqli_next_result($ db));結果をクリアするために必要なことを読みましたが、5,000分割されたものに対してはそれがあります)

50,000挿入1は2秒で実行され、5,000挿入1(50,000行のうち)は40秒かかります。foreachで新しいmysqli接続を作成したいのですが(50,000挿入の場合)、常にそうとは限りません。仕事...

読み取っているファイルに数十万、場合によっては数百万の行が含まれている可能性がある場合、50,000をすべて挿入するのに40秒かかるため、関数をより高速に実行するためのヒントが必要です。

function log2db(){
$db = mysqli_connect(SQLHOST, SQLUSER, SQLPASS, SQLDB);
if($db){
    $qar = logparse("world2.chat", loglen());
    $query = "";
    $i = 0;
    foreach($qar['data'] as $q){
        $i++;
        $uid = $q['uid'];
        $type = $q['type'];
        $chldst = $q['chldst'];
        $time = $q['date'];
        $msg = $q['msg'];
        $query .= "insert into `messages` (`uid`, `type`, `chldst`, `time`, `message`) values ('$uid', '$type', '$chldst', '$time', '$msg');\n";
        if(!($i % 5000)){
            $qquery[] = $query;
            $query = "";
        }
    }
    $qquery[] = $query;
    foreach($qquery as $qq){
        $q = mysqli_multi_query($db, $qq);
        if($q){
            while (mysqli_more_results($db) && mysqli_next_result($db));
        } else {
            mysqli_error($db);
            return false;
        }
    }
    if($qar !== null){
        loglen($qar['filelen']);
    }
    return true;
}
return false;

}

私が思いついたものは(常に機能しますが、私が言ったように遅いです)、それを改善するためのヒントはありますか?

4

1 に答える 1

2

INSERT INTOクエリが1つのクエリに複数の行を挿入できることをご存知ですか?

$parts  = array();

foreach($qar['data'] as $q){

    $uid    = $q['uid'];
    $type   = $q['type'];
    $chldst = $q['chldst'];
    $time   = $q['date'];
    $msg    = $q['msg'];

    $parts[] = "('$uid', '$type', '$chldst', '$time', '$msg')";
 }

$query  = "INSERT INTO `messages` (`uid`, `type`, `chldst`, `time`, `message`)";
$query .= "VALUES ".implode(', ', $parts);

mysqli_query($db, $query)
于 2011-02-21T21:42:27.480 に答える