我一直在尋找異步數據庫請求PHP使用mysqlnd。代碼工作正常,但比較性能從一個合理大小的表中提取數據與使用異步請求在多個表中分配相同的數據我沒有得到任何類似我期望的性能,儘管根據硬件設置它看起來相當可改變。MySQL異步數據庫請求性能
據我瞭解我要實現的,而不是:
x = a + b + c + d
相反:
x = max(a, b, c, d)
哪裏x
是所用的總時間和a
到d
是單個請求的時間。我實際上看到的是一些設置的性能略有提高,而其他性能則更差,就好像請求並不是異步的。歡迎來自其他人的任何想法或經驗,他們可能已經與此合作並遇到同樣的情況。
編輯:在這裏測量計時,我們正在討論遍佈10個表的查詢,單獨查詢花費不超過8秒左右才能完成,將每個單獨請求完成的時間(不是異步)合併在一起18秒。
異步執行相同的請求總查詢時間也是大約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));
?>
您是如何衡量性能的,您究竟期待什麼,以及您首先使用什麼代碼來執行異步數據庫請求?在大多數PHP用例中,異步數據庫通信不會產生任何性能(這與整個堆棧的運行有很大關係)。 –
按照PHP文檔實現,我期望接近我上面描述的'max(a,b,c,d)'。 '在大多數用例中,異步數據庫通信不會產生任何性能' - 你能解釋一下嗎? –
異步任何事情背後的想法是使用由OS提供的事件接口('epoll','kqueue','IOCP'),以便CPU可以用於數據尚未存在的情況。當數據在MySQL和PHP之間傳遞時,代碼的其餘部分究竟在幹什麼?此外,異步數據或同步數據「傳送」仍然意味着您將通過相同的不可靠網絡傳送相同數量的數據。真的沒有比這更快的了。我看不到您使用的代碼或SAPI,但我的評論對於大部分PHP用例都是有效的。 –