我试图插入大量从文本文件解析的数据尝试了很多方法(在我的服务器上大约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插入一个在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;
}
我想出的是什么(总是有效,但就像我说的那样慢),有关如何改进的提示吗?
答案 0 :(得分:2)
您是否意识到INSERT INTO查询可以在单个查询中插入多行?
$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)