首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP和Mysql异步比本机阻塞PDO慢?

问PHP和Mysql异步比本机阻塞PDO慢?
EN

Stack Overflow用户
提问于 2021-03-05 09:32:49
回答 2查看 369关注 0票数 0

我正在用安培进行一些测试,看看它如何通过运行异步来帮助加快SQL查询的速度。我想我做错了什么,因为这个测试文件的结果非常令人失望,而不是我所期望的。我做错什么了吗?

下面的代码给出了这样的结果,第一个数字是Amp\Mysql,由于某种原因,速度要慢得多:

代码语言:javascript
复制
0.37159991264343
0.10906314849854

PHP代码:

代码语言:javascript
复制
<?php
require 'vendor/autoload.php';
require 'Timer.php';

$runThisManyTimes = 1000;

///////////////////////////////////////////////////////////

use Amp\Mysql\ConnectionConfig;
use Amp\Loop;

Loop::run(function() use ($runThisManyTimes) {
    $timer = Timer::start();

    $config = ConnectionConfig::fromString(
        "host=127.0.0.1 user=test password=test db=test "
    );

    /** @var \Amp\Mysql\Pool $pool */
    $pool = Amp\Mysql\pool($config);

    /** @var \Amp\Mysql\Statement $statement */
    $statement = yield $pool->prepare("SELECT * FROM accounts WHERE id = :id");

    for ($i = 1; $i <= $runThisManyTimes; $i++) {
        /** @var \Amp\Mysql\ResultSet $result */
        $result = yield $statement->execute(['id' => '206e5903-98bd-4af5-8fb1-86a520e9a330']);

        while (yield $result->advance()) {
            $row = $result->getCurrent();

        }
    }

    $timer->stop();
    echo $timer->getSeconds();

    Loop::stop();
});

echo PHP_EOL;

///////////////////////////////////////////////////////////

$timer = Timer::start();

$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'test', 'test');

$statement = $pdo->prepare("SELECT * FROM accounts WHERE id = :id");

for ($i = 1; $i <= $runThisManyTimes; $i++) {
    $statement->execute(['id' => '206e5903-98bd-4af5-8fb1-86a520e9a330']);
    $statement->fetch();
}

$timer->stop();
echo $timer->getSeconds();
EN

回答 2

Stack Overflow用户

发布于 2021-03-05 23:04:36

当每个线程花费的时间少于1秒时,MySQL的并行执行是无效的。

每个线程必须使用自己的连接;建立连接需要一些时间。

您的特定基准(与大多数基准一样)并不十分有用。在第一次执行单个SELECT之后,所有后续的执行都可能花费不到1ms。最好使用一系列反映应用程序的语句。

票数 0
EN

Stack Overflow用户

发布于 2021-07-08 19:56:47

您的基准测试不包括任何并发性,因此它基本上就像PDO示例中的阻塞I/O。amphp/mysql在PHP中是一个完整的协议实现,所以它比PDO的C实现要慢一些。

如果您想了解非阻塞并发I/O是否对您的应用程序有好处,并且您目前正在使用顺序阻塞的PDO查询,则应该使用amphp/mysql而不是串行查询对那些非阻塞并发查询进行基准测试。

此外,amphp/mysql可能没有PDO背后的数据库驱动程序那么优化,但它允许非阻塞并发查询,而PDO不支持这种查询。如果您执行顺序查询,PDO暂时肯定会有更好的性能,但是一旦涉及到并发性,amphp/mysql就非常有用。

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

https://stackoverflow.com/questions/66490021

复制
相关文章

相似问题

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