mysqli :: multi_query比几个单一查询更有效吗?

Emm*_*elG 7 php mysqli

有人在答案中提出了MySQLi multi_query函数,声称它比循环遍历3个单独的查询要好.我尝试了Google的某些答案,但并没有真正满足我的好奇心,所以我希望你们可以更好地了解使用它的原因,而不是保存几行代码.

所以这就是我想知道的:

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

我知道每次敲打数据库3次,每次打碎一百万个项目并将其粉碎成一个巨大的对象并不利于内存使用,但我知道必须存在它存在的原因,我也确定有时候应该避免.我希望能够更好地理解它,这样我就可以在需要时把它放到我的包里.

谢谢你的时间!

Dav*_*dom 13

  • 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%的时间它们只会在传递的数据中有所不同,查询结构将保持不变 - 这是一个明显的候选人准备好的陈述.