当塞巴斯蒂安(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()
的问题,您实际上必须解决常规的查询速度问题。因此,这里有一些建议:
说到克雷格的情况,它非常类似于已知的innodb写速度问题。默认情况下,innodb引擎设置为非常谨慎的模式,在该模式下,直到引擎确保成功完成前一个写入之后,才执行后续写入。因此,它使写入速度非常慢(大约只有10个查询/秒)。常见的解决方法是一次完成所有写入操作。对于插入查询,有很多方法:
虽然仅用于更新和删除事务仍然是可靠的方法。因此,作为一种通用解决方案,可以提供一种解决方法
$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/