我一直在使用mysqlnd查看 PHP 中的异步数据库请求。代码工作正常,但比较性能从一个合理大小的表中提取数据与使用异步请求跨多个表的相同数据分割我没有得到任何类似我期望的性能,尽管根据硬件设置看起来似乎相当可变
据我了解,我应该实现,而不是:
x = a + b + c + d
相反:
x = max(a, b, c, d)
x
为总时间,a
至d
为个别请求的时间。我实际看到的是在某些设置上的性能相当小的增加,而在其他设置上性能更差,就好像请求根本不是异步的一样。任何可能与之合作过并且遇到过这种想法或经历的人都会受到欢迎。
异步执行相同的请求总查询时间也是大约18秒。很明显,这些请求并没有与数据库并行执行。
编辑:使用的代码完全如文档here
中所示<?php
$link1 = mysqli_connect();
$link1->query("SELECT 'test'", MYSQLI_ASYNC);
$all_links = array($link1);
$processed = 0;
do {
$links = $errors = $reject = array();
foreach ($all_links as $link) {
$links[] = $errors[] = $reject[] = $link;
}
if (!mysqli_poll($links, $errors, $reject, 1)) {
continue;
}
foreach ($links as $link) {
if ($result = $link->reap_async_query()) {
print_r($result->fetch_row());
if (is_object($result))
mysqli_free_result($result);
} else die(sprintf("MySQLi Error: %s", mysqli_error($link)));
$processed++;
}
} while ($processed < count($all_links));
?>
答案 0 :(得分:2)
我会扩展我的评论,并尝试解释为什么您使用当前的设置无法获得任何性能。
在您的情况下,异步意味着与其他代码相比,检索数据的过程是异步的。两个移动部件(获取数据)和处理数据是分开的,并且一个接一个地执行,但只有当数据到达时才。
这意味着您希望充分利用CPU,因此在数据准备好之前,您不会调用PHP代码。
为了实现这一点,您必须抓住PHP进程的控制权并使其使用操作系统的事件接口之一(Linux上为epoll
或Windows上为IOCP
) 。由于PHP嵌入到Web服务器(mod_php
)或作为自己的独立FCGI服务器(php-fpm
)运行,这意味着当您运行CLI php脚本时,异步数据获取的最佳利用率因为否则很难利用事件接口。
但是,让我们关注您的问题以及为什么您的代码不会更快。
您认为自己受CPU限制并且您的解决方案是以块的形式检索数据并以这种方式处理它们 - 这很好,但是因为您没有做任何事情会产生更快的执行速度,这意味着您是100%I / O界。
从数据库检索数据的过程会强制硬盘执行搜索。无论你有多少&#34; chunk&#34;如果磁盘很慢并且数据散布在磁盘周围 - 那部分将会很慢并且创建更多处理部分数据的工作人员只会使系统变得越来越慢,因为每个工作人员都会遇到同样的问题。检索数据。
我得出的结论是,你的问题在于速度慢的硬盘,这个数据集太大,可能不适合用于分块检索。我建议更新此问题或创建另一个问题,以帮助您更快地以更优化的方式检索数据。