PHP mysqli_multi_query大插入问题

时间:2011-02-21 21:17:01

标签: php mysqli mysqli-multi-query

我试图插入大量从文本文件解析的数据尝试了很多方法(在我的服务器上大约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;

}

我想出的是什么(总是有效,但就像我说的那样慢),有关如何改进的提示吗?

1 个答案:

答案 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)