2015-08-21 84 views
0

我一直在尋找異步數據庫請求PHP使用mysqlnd。代碼工作正常,但比較性能從一個合理大小的表中提取數據與使用異步請求在多個表中分配相同的數據我沒有得到任何類似我期望的性能,儘管根據硬件設置它看起來相當可改變。MySQL異步數據庫請求性能

據我瞭解我要實現的,而不是:

x = a + b + c + d 

相反:

x = max(a, b, c, d) 

哪裏x是所用的總時間和ad是單個請求的時間。我實際上看到的是一些設置的性能略有提高,而其他性能則更差,就好像請求並不是異步的。歡迎來自其他人的任何想法或經驗,他們可能已經與此合作並遇到同樣的情況。

編輯:在這裏測量計時,我們正在討論遍佈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)); 
?> 
+2

您是如何衡量性能的,您究竟期待什麼,以及您首先使用什麼代碼來執行異步數據庫請求?在大多數PHP用例中,異步數據庫通信不會產生任何性能(這與整個堆棧的運行有很大關係)。 –

+0

按照PHP文檔實現,我期望接近我上面描述的'max(a,b,c,d)'。 '在大多數用例中,異步數據庫通信不會產生任何性能' - 你能解釋一下嗎? –

+1

異步任何事情背後的想法是使用由OS提供的事件接口('epoll','kqueue','IOCP'),以便CPU可以用於數據尚未存在的情況。當數據在MySQL和PHP之間傳遞時,代碼的其餘部分究竟在幹什麼?此外,異步數據或同步數據「傳送」仍然意味着您將通過相同的不可靠網絡傳送相同數量的數據。真的沒有比這更快的了。我看不到您使用的代碼或SAPI,但我的評論對於大部分PHP用例都是有效的。 –

回答

2

我會擴大我的意見,我會嘗試解釋爲什麼你會不會用你當前的設置獲得任何性能。

在你的情況下,異步意味着檢索數據的過程與其他代碼相比是異步的。兩個移動部分(獲取數據)和處理數據是分開的,並且一個接一個地執行,但是當數據到達時只有

這意味着您要充分利用CPU,因此在數據準備就緒之前您不會調用PHP代碼。

爲了實現這個目標,您必須抓住PHP進程的控制權並使其使用操作系統的事件接口(Linux上的epoll或Windows上的IOCP)。由於PHP要麼嵌入到Web服務器(mod_php)中,要麼作爲其自己的獨立FCGI服務器(php-fpm)運行,這意味着在運行CLI php腳本時最好利用異步數據獲取,因爲使用事件接口非常困難除此以外。

但是,讓我們專注於您的問題以及爲什麼您的代碼不會更快。

你認爲你是CPU綁定的,你的解決方案是以塊的形式檢索數據並且以這種方式處理數據 - 這很好,但是因爲沒有你做得到更快的執行,這意味着你100%的I/O限制。

從數據庫檢索數據的過程強制硬盤執行查找。無論你的「塊」多少,如果磁盤速度很慢,並且數據散佈在磁盤周圍 - 那部分速度會變慢,並且創建更多處理部分數據的工作人員將使系統變得越來越慢每個工作人員在檢索數據時都會遇到同樣的問題。

我得出結論說,你的問題在於硬盤速度太慢,太大的數據集可能不適合分塊檢索。我建議更新此問題或創建另一個問題,以幫助您更快速地以更優化的方式檢索數據。