mysqli::multi_query是否比几个单个查询更高效



有人在回答中提到MySQLi multi_query函数,声称它比在3个单独的查询中循环要好。我试着在谷歌上找到一些答案,但没有得到任何真正满足我好奇心的东西,所以我希望你们能更好地了解使用它的原因,而不是保存几行代码。

我想知道的是:

  1. multi_query到底在做什么
  2. multi_query是否只是点击服务器x次并聚合结果
  3. 是否存在单个查询可能比多个查询更高效的情况

我知道,为了一百万个项目,对数据库进行三次撞击,并将其粉碎成一个巨大的对象,这对内存使用来说是不好的,但我知道它的存在肯定有原因,我也相信有时应该避免。我希望能更好地理解它,这样我就可以在需要的时候把它放进我的技巧袋里。

谢谢你抽出时间!

  • What is multi_query doing under the hood?-只需一次将所有查询发送到服务器,而不是一次发送一个,并一次性检索所有结果。没有什么比这更复杂的了。

  • Does multi_query simply hit the server x number of times and aggregates the results?——它"命中"服务器两次——一次发送查询,一次检索结果。

  • Is there a case where single queries may be more efficient than multiple queries?-取决于如何定义"高效"。multi_query()在网络上很轻,但内存很重,在循环中运行query()反之亦然。

    对于许多返回大结果集的SELECT语句来说,内存消耗的损失可能远远超过网络的收益,大多数时候,您最好一次发出查询并处理一个结果集,尽管这完全取决于您对数据的处理方式。但是,如果您需要运行许多UPDATE语句,那么multi_query()可能会更好,因为返回值只是成功/失败,并且内存消耗很小。

    你必须权衡所有因素,比如你正在做什么,你预计需要多长时间,(数据库(服务器和客户端之间的网络延迟,服务器和客户端上的可用资源(主要是内存(,等等……并根据具体情况进行处理。

我发现了一段时间前进行的一些性能测试的记录,其中的结论是使用multi_query()可以获得总体效率提升然而测试用例只是运行了4个查询,每个查询都是SELECT,而"更高效"的定义只是"更快"。没有针对大量查询或更大结果集的测试,虽然速度很重要,但它并不是全部——如果我给任何东西无限的内存,我可以让它运行得非常快,但同时做任何事情的尝试都会失败。它也不是一个真实世界的测试,因为最终结果可以通过一个JOINed查询来实现。不过,它确实让人读起来很有趣。

就我个人而言,我觉得这有点学术性,因为如果同时运行一大组语句,90%的时间它们只会在传递的数据中发生变化,查询结构将保持不变-这显然是准备好的语句的候选者。

上面的答案是错误的。

multi_query到底在做什么?

它只是一次将所有查询发送到服务器,同时只检索第一个查询的结果步查询执行的一种包装器

multi_query是否只是点击服务器x次并聚合结果?

multi_query只访问服务器一次。您必须通过调用next_result手动执行的所有其他命中操作,才能获得所有其他查询的结果。

是否存在单个查询可能比多个查询更高效的情况?

这个问题假定存在multiquery更快的情况。这是一个值得怀疑的说法。对于通常的查询,网络延迟在整个执行时间中只占可忽略的一部分。如果你真的很关心这样幅度的速度,那就看看HandlerSocket吧,它会很快。然而,对于常规开发来说,单查询和多查询之间的这种差异将是您最不关心的。如果你关心的是现实生活中的事情,而不是想象中的事情。

相关内容

最新更新