2011-11-23 105 views
2

我是新來處理大量的數據。我想知道在批量查詢數據庫時是否有任何最佳做法,或者是否有人可以提供任何建議。PHP MySQL批量運行查詢

我有一個查詢,將拉出所有的數據和PHP用於寫入數據到XML文件。可以有10到50萬行數據的任何地方,因此我可以通過腳本來獲取50批次的數據,寫入文件,然後獲得下50行,將其附加到文件等等。或者我應該做其他事情?我可以增加批量大小,還是應該減小它以使腳本運行得更快?

任何意見將不勝感激。

+0

您可以使用'mysqldump --xml'轉儲您的數據庫 – Oroboros102

回答

3

是的,對於巨大的結果,建議使用批處理(性能和內存原因)。

Here is benchmark and example code of running query in batches

+0

文章建議一個較大的提取速度更快... – ajreal

+0

是的,但如果您有內存限制或流式傳輸結果給用戶其唯一的解決方案在MySQL中。 – rogal111

+0

一個大的提取會更快,但關注點通常會碰到腳本執行超時。因此,本文將討論如何分割工作,但通過腳本而不是MySQL LIMIT功能 – Chris

1

要做到這一點,最好的辦法依賴於幾個不同的事情。最重要的是你何時以及爲什麼要創建這個XML文件。

如果您按需創建XML文件,並且用戶正在等待該文件,那麼您需要對性能進行一些微調和測試。

如果是定期創建的東西,也許是每晚或每小時的任務,然後在構建XML文件後(如RSS提要生成器)請求XML文件,那麼如果你有什麼工作,我會建議不要搞亂用它。

就性能而言,有不同的事情可以提供幫助。將一些簡單的計時器放入腳本中,並使用每批記錄的數量來查看是否存在性能差異。

$start = microtime(true); 
//process batch 
$end = microtime(true); 
$runTimeMilliseconds = $end - $start; 

如果問題是用戶反饋,您可以考慮使用AJAX啓動每批並向用戶報告進度。如果您向用戶提供反饋,他們通常會很樂意等待更長時間,而不是等待整個頁面刷新。

此外,請檢查您的SQL查詢以確保沒有隱藏的性能處罰。 EXPLAIN可以向你展示MySQL如何處理你的查詢。

在極端情況下,我想通過並行處理可以實現最佳性能。我沒有在PHP中使用它,但這裏的主要參考http://www.php.net/manual/en/refs.fileprocess.process.php

根據您的託管環境,您可以找到記錄的總數並將其分成子流程。每個構建自己的XML片段。然後你可以合併碎片。所以進程1可以處理記錄爲0〜99,過程2 100 199等

1

你會驚訝一個簡單的選擇都無極限是最快的,
因爲它只能查詢一次數據庫,
一切是本地處理

$sql = select all_columns from table; 

<?php 
// set a very high memory 

// query without limit, if can avoid sorting is the best 

// iterate mysql result, and set it to an array 
// $results[] = $row 
// free mysql_result 

// write xml for every one thousand 
// because building xml is consuming MOST memory 
for ($i=0; $i<$len; ++$i) 
{ 
    $arr = $results[$i]; 
    // do any xml preparation 

    // dun forget file-write is expensive too 
    if ($i%1000 == 0 && $i > 0) 
    { 
    // write to file 
    } 
} 
?> 
1

最好的方法是將它安排爲CRON作業,我認爲這是用於PHP批處理的最佳解決方案。檢查此鏈接的更多信息! Batch Processing in PHP。希望這可以幫助。