【问题标题】:php mysqli/multi_query cannot be proceeded more then oncephp mysqli/multi_query 不能再进行一次
【发布时间】:2018-01-19 01:36:57
【问题描述】:

我有一个字符串数组,它们是 sql“输入到...”查询。我遍历这个数组,将它们中的每 50 个组合成一个新字符串,然后发送到 mysql 数据库。之后,我重置了我的临时字符串并为新查询做准备。

但我的数组在第一次查询后停止并且不想在数据库服务器上发送所有内容,所以我总是只有 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(); 

【问题讨论】:

    标签: php mysql bulk-load


    【解决方案1】:

    为了解决您的代码无法正常工作的原因,我建议您在将其作为查询提交之前查看$queryPartial 的完整字符串。我敢打赌有一个语法错误,因为你没有用; 或类似的东西分隔语句。

    查看查询本身,而不是您的代码,可能会更清楚错误在哪里。

    您还应该检查 mysqli 函数返回的错误状态。如果发生错误,大多数 mysqli 函数都会返回 FALSE,您应该检查 $connection->error 以获取错误消息。如果你不这样做,可能会发生错误,但你永远不会知道。

    我猜你是在使用多查询来节省数据库调用,假设调用更少会提高性能。

    但是与插入数据的事务的成本相比,调用的成本很小。使用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

    有关性能比较,请参阅我的演示文稿Load Data Fast!

    【讨论】:

    • 首先,感谢您如此复杂的回复。我确信查询本身不是问题,因为所有这些查询都是由我之前的代码自动生成的,并在最后包含分号。正如您所建议的,我已经放置了一个 $connection->error 并在每次循环迭代时收到多个“命令不同步;您现在无法运行此命令”消息。这是什么意思?
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 2011-12-14
    • 2013-07-13
    • 2018-09-22
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多