有人在答案中提出了MySQLi multi_query函数,声称它比循环遍历3个单独的查询更好。我尝试了Google的某些答案,但并没有真正满足我的好奇心,所以我希望你们可以更好地了解使用它的原因,而不是保存几行代码。
所以这就是我想知道的:
我知道每次击中数百万个项目并将其粉碎成一个巨大的物体3次并不利于内存使用,但我知道必须存在它存在的原因,我也确定是应该避免的时候。我希望能够更好地理解它,以便在需要时我可以将它放入我的技巧包中。
谢谢你的时间!
答案 0 :(得分:12)
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()
可能会更好,因为返回值只是成功/失败并且内存消耗很少。
您必须权衡所有因素,例如您正在做什么,您期望它采取多长时间,(数据库)服务器和客户端之间的网络延迟,服务器上的可用资源(主要是内存)以及客户等等......并根据具体情况进行处理。
我刚刚发现这个record of some performance testing,其结论是使用multi_query()
可以获得整体效率提升。 然而测试用例只是运行4个查询,每个查询SELECT
一个结果,“更有效”的定义只是“更快”。没有测试大量的查询或更大的结果集,虽然速度很重要,但它并不是全部和最终 - 如果我给它无限量的内存,我可以让任何东西运行得非常快,但是试图同时做任何事都会失败。它也不是真实世界的测试,因为最终结果可以通过单个JOIN
ed查询来实现。它确实有一些有趣的读物。
就个人而言,我觉得这有点学术性,因为如果你 一次运行大量语句,90%的时间它们只会在传递的数据和查询结构上有所不同将保持不变 - 这是准备好的陈述的明显候选人。
答案 1 :(得分:1)
上面的答案是错误的。
什么是multi_query在幕后做什么?
它只会立即将所有查询发送到服务器,同时仅检索第一个的结果。因此,实际上,multi_query是异步的一种包装器查询执行。
multi_query是否只是点击服务器x次并聚合结果?
multi_query只在服务器上点击一次。通过调用next_result,您必须执行手动所有其他操作,以获取所有其他查询的结果。
是否存在单个查询可能比多个查询更有效的情况?
这个问题假设有一个multi_query更快的情况。这是一个值得怀疑的陈述。对于通常的查询,网络延迟是整个执行时间的一个可忽略的部分。如果你真的关注这样边距的速度,那么看看HandlerSocket - 它会非常快速。但是,对于常规开发,单个和多个查询之间的差异将是您最不关心的问题。如果你关心真实生活,而不是虚构的生活。