簡體   English   中英

PHP Amp\Mysql 異步比原生阻塞 PDO 慢?

[英]PHP Amp\Mysql async slower than native blocking PDO?

我正在使用Amp進行一些測試,並嘗試通過異步運行 SQL 查詢來幫助加速它們。 我認為我做錯了什么,因為這個測試文件的結果非常令人失望,而不是我所期望的。 有什么我做錯了嗎?

下面的代碼給了我這樣的結果,第一個數字是 Amp\Mysql 並且由於某種原因它要很多:

0.37159991264343
0.10906314849854

PHP 代碼:

<?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();

當每個線程花費的時間少於 1 秒時,MySQL 的並行執行是無效的。

每個線程必須使用自己的連接; 建立連接需要一些時間。

您的特定基准(如大多數基准)不是很有用。 在第一次執行該單個SELECT ,所有后續執行可能需要不到 1 毫秒。 最好使用反映您的應用程序的一系列語句。

您的基准測試不包括任何並發性,因此它基本上就像 PDO 示例中的阻塞 I/O。 amphp/mysql是 PHP 中的完整協議實現,因此預計它會比 PDO 的 C 實現慢。

如果您想了解非阻塞並發 I/O 是否對您的應用程序有好處,並且您當前正在使用順序阻塞 PDO 查詢,您應該使用amphp/mysql而不是串行查詢,對非阻塞並發查詢進行基准測試。

此外, amphp/mysql的優化可能不如 PDO 背后的數據庫驅動程序那么優化,但它允許非阻塞並發查詢,這是 PDO 不支持的。 如果做順序查詢的話,PDO暫時肯定會有更好的性能,但是一旦涉及到並發, amphp/mysql就非常有用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM