php mysqli/multi\u查询不能再进行一次

von4xj4u  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(389)

我有一个字符串数组,它们是sql“input into…”查询。我在这个数组中循环,将每50个数组组合成一个新字符串,然后发送到mysql数据库。之后,我重置了我的临时字符串,并为新的查询做准备。
但我的数组在第一次查询后停止,并且不想发送所有内容,所以在db server上我总是只有50条记录。如何修复代码并发送所有内容?
代码:

$data // array with sql queries 
$queryPartial = ''; // additional string for 50 queries to send

           foreach ($data as $index => $queryToSend) {

                $queryPartial .= $queryToSend;

                // send partials query
                if($index % 50 == 0)
                {

                    if($connection->multi_query($queryPartial))
                    {
                        $this->output->writeln('succesfull query number: '.$index);
                    } 
                    $queryPartial = ''; // clean string for next queries
                }

           }   
              //send the rest of the remaining queries
             if($queryPartial !== ''){

                 if($connection->multi_query($queryPartial))
                 {
                    $this->output->writeln('rest of the queries sended');
                 } 
             }

          $connection->close();
byqmnocz

byqmnocz1#

为了解决代码不起作用的原因,我建议查看 $queryPartial 在将其作为查询提交之前。我打赌有语法错误,因为你没有用 ; 或者类似的。
查看查询本身(而不是代码)可能会更清楚错误所在。
您还应该检查mysqli函数返回的错误状态。如果发生错误,大多数mysqli函数都返回false,您应该检查 $connection->error 对于错误消息。如果你不这样做,错误可能会发生,但你永远不会知道。
我猜您是在使用multi-query来节省数据库调用的开销,假设调用次数减少将有助于提高性能。
但是,与插入数据的事务的成本相比,进行调用的成本很小。实际上,使用 multi_query() .
下面的代码做了同样的事情,具有几乎相同的性能,代码简单得多:

foreach ($data as $index => $queryToSend) {
    $result = $connection->query($queryToSend);
    if ($result === false) {
        error_log("SQL: $queryToSend ERROR: {$connection->error}");
    }
}

(始终检查mysqli函数返回的错误状态!)
如果您试图加快批量插入的性能,请使用 multi_query() 与其他优化相比没有什么好处:
将多行合并为一行 INSERT 陈述
将多个语句合并到一个事务中
使用 LOAD DATA INFILE 而不是 INSERT 查看我的演示文稿快速加载数据!用于性能比较。

相关问题