首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PHP Mysql multi_query()比循环查询()慢

为什么PHP Mysql multi_query()比循环查询()慢
EN

Stack Overflow用户
提问于 2016-02-21 10:25:53
回答 1查看 591关注 0票数 0

我正在和MySQL一起研究HHVM。我真的很困惑地发现,使用multi_query()对2000SQL查询进行批处理要比使用单个query()的2000循环慢得多(请参阅最后的代码和结果)。通过进一步的分析,我发现next_result()接口占用了大部分时间(~70%)。

我的问题是:

(1) next_result()接口为什么这么慢?

(2)如果我想同时执行数千个sql查询,有什么方法比简单的循环更好吗?

谢谢!

代码如下(php):

代码语言:javascript
复制
$conn = new mysqli("localhost", "root", "pwd", "table");

$loop = 2000;
$q = "select * from ContactInfo;";

// single query in a loop
$results = array();
$sq_start = microtime(true);
for ($i=0; $i < $loop; $i++) {
  $ret = $conn->query($q);
  $results[] = $ret;
}
for ($i=0; $i < $loop; $i++) {
  $xx = $results[$i]->fetch_all();
}
$sq_end = microtime(true);

// construct the multi-query
for ($i=0; $i < $loop; $i++) {
  $m_q .= $q; 
}

// multi-query in one round-trip
$mq_start = microtime(true);
$conn->multi_query($m_q);
do {
  $ret = $conn->store_result();
  $xx = $ret->fetch_all();
} while($conn->next_result());
$mq_end = microtime(true);

echo "Single query: " . ($sq_end - $sq_start)*1000 . " ms\n";
echo "Multi query: " . ($mq_end - $mq_start)*1000 . " ms\n";

结果如下:

代码语言:javascript
复制
Single query: 526.38602256775 ms
Multi query: 1408.7419509888 ms

注意:在这种情况下,next_result()将消耗922ms。

EN

回答 1

Stack Overflow用户

发布于 2016-02-21 10:47:01

这里最简单的答案是开销。multi_query()为每个结果集构建一个数据对象。然后它必须一遍又一遍地存储该对象。

相比之下,您一遍又一遍地运行相同的查询,但只编写了一个简单的数据数组来存储结果。然后,PHP可以释放前一个结果集的内存,因为您经常覆盖相同的变量(一旦数据对象在内部没有任何指向它的内容,它就可以是garbage collected)。

不过,这不是一个很好的用例。这里没有实际的应用程序,因为不需要一遍又一遍地运行相同的查询(您的数据库应该在第一次运行时缓存结果,然后将数据存储在内存中,以便更快地检索)。对于单个结果集,此处的差异可以忽略不计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35531583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档