我尝试了很多方法试图插入从文本文件解析的大量数据(在我的服务器上大约 2 秒内将 200,000 行文本解析到数组中,所以我知道这部分不是问题)。我使用的 mysqli_multi_query 以 5,000 块为单位发送查询(出于某种原因,如果我想多次使用 multi_query,它会拒绝执行更大的操作),或者如果我将文本文件拆分为 50,000 行左右,我可以将它们全部插入2秒内立即。如果我这样做,那么它拒绝运行另一个查询(我确实读过我需要执行 while (mysqli_more_results($db) && mysqli_next_result($db)); 来清除结果,并且我确实有 5,000 个拆分的查询)
50,000 条插入在 2 秒内运行,5,000 条插入(50,000 行)需要 40 秒,我有点想在 foreach 中创建一个新的 mysqli 连接(用于 50,000 条插入),但并不总是如此工作...
我想要一些关于如何让我的函数运行得更快的提示,因为当我正在读取的文件可能包含几十万可能数百万行时,从 40 秒插入所有 50,000 条需要永远
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;
}
我想出的办法(总是有效,但就像我说的很慢),有什么关于如何改进它的建议吗?