テキストファイルから解析された大量のデータを挿入するために、さまざまな方法を試しました(サーバーでは、約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;
}
私が思いついたものは(常に機能しますが、私が言ったように遅いです)、それを改善するためのヒントはありますか?