当塞巴斯蒂安(Sebastien)表示他在每次使用mysqli_multi_query() @ Can mysqli_multi_query do UPDATE statements?之间断开连接并重新连接时,我感到非常害怕,因为这似乎不是最佳实践。

但是,Craig @ mysqli multi_query followed by query在他的案例中表示,在每次使用mysqli_multi_query()之间断开连接并重新连接比使用mysqli_next_result()更快。

我想问一下,当程序员应该选择“新连接”还是“下一个结果”方法时,是否有人有进一步的第一手知识或基准证据来建议一个近似的“临界值”(基于查询量等)。

我也很高兴听到与速度无关的任何/所有担忧。克雷格(Craig)使用连接功能对速度有影响吗?

Craig的while语句之间是否存在速度差异:

while ($mysqli->next_result()) {;}

- 相对 -

我建议的一会儿声明:
while(mysqli_more_results($mysqli) && mysqli_next_result($mysqli));

- 相对 -

在运行第一个multi_query之前,为每个预期的multi_query创建一个新的连接。我刚刚对此进行了测试,并且两个mysqli_multi_query()没有错误=不需要close():
$mysqli1=mysqli_connect("$host","$user","$pass","$db");
$mysqli2=mysqli_connect("$host","$user","$pass","$db");

- 相对 -

在每个mysqli_multi_query()(例如Sebastien和Craig)之间打开和关闭:
$mysqli = newSQL();
$mysqli->multi_query($multiUpdates);
$mysqli->close();

- 相对 -

有人还有其他选择可以测试吗?

最佳答案

怪不是next_result()而是要查询自己。您的代码运行时间取决于实际查询执行时间。

尽管mysqli_multi_query()返回控制相当快,但并不意味着所有查询都在那个时候执行了。 恰恰相反,在mysqli_multi_query()完成时,仅执行了第一个查询。而所有其他查询则在mysql端排队等待异步执行。

由此您可能会得出结论,next_result()调用本身并不会添加任何超时-它只是在等待下一个查询完成。如果查询本身需要时间,那么next_result()也必须等待。

知道您已经可以选择哪种方法:如果您不关心结果,则可以关闭连接。但实际上,这只是在地毯下扫灰尘,将所有缓慢的查询留在原地。因此,最好将next_result()循环保留在适当的位置(特别是因为无论如何您都必须检查错误/受影响的行等),但要自己加快查询速度。

因此,事实证明,要解决next_result()的问题,您实际上必须解决常规的查询速度问题。因此,这里有一些建议:

  • 对于选择查询,它是通常的索引编制/解释分析,已经在其他答案中进行了解释。
  • 对于DML查询(尤其是分批运行),还有其他方法:

  • 说到克雷格的情况,它非常类似于已知的innodb写速度问题。默认情况下,innodb引擎设置为非常谨慎的模式,在该模式下,直到引擎确保成功完成前一个写入之后,才执行后续写入。因此,它使写入速度非常慢(大约只有10个查询/秒)。常见的解决方法是一次完成所有写入操作。对于插入查询,有很多方法:
  • 您可以使用多个值插入语法
  • 您可以使用LOAD DATA INFILE查询
  • 您可以将所有查询包装在一个事务中。

  • 虽然仅用于更新和删除事务仍然是可靠的方法。因此,作为一种通用解决方案,可以提供一种解决方法
     $multiSQL = "BEGIN;{$multiSQL}COMMIT;";
     $mysqli->multi_query($multiSQL);
     while ($mysqli->next_result()) {/* check results here */}
    

    如果在您的情况下不起作用/不适用,则建议为循环运行的单个查询更改mysqli_multi_query(),调查并优化速度,然后返回multi_query。

    关于php - 快速/最佳实践刷新mysqli_multi_query(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22531943/

    10-12 07:18