gpt4 book ai didi

php - 速度/最佳实践刷新 mysqli_multi_query()

转载 作者:可可西里 更新时间:2023-10-31 22:46:18 25 4
gpt4 key购买 nike

当 Sebastien 说他在每次使用 mysqli_multi_query() @ Can mysqli_multi_query do UPDATE statements? 之间断开连接并重新连接时,我感到畏缩。因为这似乎不是最佳实践。

然而,克雷格@mysqli multi_query followed by query在他的案例中指出,在每次使用 mysqli_multi_query() 之间断开连接和重新连接比使用 mysqli_next_result() 更快。​​

我想问一下是否有人有进一步的第一手知识或基准证据来建议程序员应该选择“新连接”与“下一个结果”方法的近似“截止”(基于查询量或其他) .

我也很高兴听到任何/所有与速度无关的问题。 Craig 使用连接函数对速度有影响吗?

Craig 的 while 语句是否有速度差异:

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

- 与 -

我建议的 while 语句:

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() 的问题,您必须实际解决查询速度的常规问题。因此,这里有一些建议:

  1. 对于选择查询,它通常是索引/解释分析,已在其他答案中解释过。
  2. 对于DML查询,尤其是批量运行,还有其他方式:

说到Craig的案例,它很像已知的innodb写入速度问题。默认情况下,innodb 引擎设置为非常谨慎的模式,在引擎确保前一个成功完成之前,不会执行后续写入。因此,它使写入速度非常慢(大约只有 10 个查询/秒)。常见的解决方法是一次进行所有写入。对于插入查询,有很多方法:

  • 你可以使用多值插入语法
  • 你可以使用 LOAD DATA INFILE 查询
  • 您可以将所有查询包装在一个事务中。

虽然仅更新和删除事务仍然是可靠的方式。因此,作为一种通用解决方案,可以提供这样的解决方法

 $multiSQL = "BEGIN;{$multiSQL}COMMIT;";
$mysqli->multi_query($multiSQL);
while ($mysqli->next_result()) {/* check results here */}

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com