2011-08-25 42 views
6

我有一個具有4個內核的單個數據庫服務器和一個運行PHP的Web服務器。我希望一個PHP腳本能夠向數據庫服務器發出查詢,以便它們在數據庫服務器上並行執行,每個mysqld進程上一個。通常在PHP中,你這樣做:PHP可以在Apache環境中發出多重處理的mysql查詢嗎?

$sql = new mysqli([insert connection parameters]); 
$sql->query("SELECT 'Complex Query A'"); 
$sql->query("SELECT 'Complex Query B'"); 
$sql->query("SELECT 'Complex Query C'"); 
$sql->query("SELECT 'Complex Query D'"); 

但是,這些連續運行,只使用一個mysqld進程。在這個應用程序中,每個查詢(A到D)正在處理數據的不同部分,但是處理同一組InnoDB表。

一個可能的解決方案是讓AJAX調用Apache將它分解爲子腳本威力並行運行,但我猜Apache會處理這些Ajax調用順序與每個客戶端一個httpd進程。

有沒有辦法做到這一點?有沒有人有與mysqlnd MYSQLI_ASYNC功能的經驗?它們可以與單個數據庫服務器和mysqli連接並行工作嗎?

目的:我們運行生成圖形的實時分析工具,並且希望利用數據庫的處理能力來加快需要時間的查詢。

回答

6

你需要的是異步查詢執行。當您有新的mysqlnd驅動程序時,可以從PHP 5.3開始 - 然後您可以將MYSQLI_ASYNC標誌傳遞給query()方法。腳本執行將繼續,而不會等待查詢完成。在poll() method的評論中,PHP手冊中有一個很好的使用示例。

對於想要並行執行的每個查詢,您將需要單獨的MySQL連接。

+0

我建議,以及在我的問題,但你確定這在使用單個連接時有效嗎?這不需要多個連接到兩個或更多不同的服務器? – Toxikman

+0

是的,它需要多個連接 - 每個查詢一個連接。我添加了一個鏈接到'mysqli_poll()'文檔,它有一個例子。 – Crack

相關問題