2010-07-27 201 views
2

我想用腳本來處理很多dta記錄,讓我們將其命名爲process.php,問題是我有一個龐大的數據集,爲了使工作更快完成,我想要運行該腳本的多個實例與同時運行php腳本

在/ usr/bin中/ PHP process.php START_RECORD end_record &

所以我讓他們並行運行像

的/ usr /斌/ PHP process.php 0 10000 &

的/ usr /斌/ PHP process.php 10000 20000 &

的/ usr /斌/ PHP process.php 20000 30000 &

的/ usr/bin中/ PHP的過程.PHP 30000 40000 &

...

我認爲這樣的工作可以更快地完成,但後呃嘗試我沒有發現它快得多,而是速度似乎非常接近線性方式(沒有併發性)。我不知道是否因爲process.php將記錄插入innodb表或什麼。

任何想法。

回答

5

如果您需要將行插入到數據庫中,它將完全沒有區別。這是數據庫的瓶頸,而不是你的PHP腳本。您仍然只能一次插入一行,因此每個併發實例只需要等待對方。

+0

謝謝。無論如何要解決這個問題? – Shawn 2010-07-27 08:21:36

+0

好點:先找到瓶頸;然後解決它。然後找到下一個瓶頸...... – xtofl 2010-07-27 08:23:25

+1

使用擴展插入和事務可能會提高性能(但不是四倍)。也可能對錶格進行分區,或者在完成主要工作後實際創建四個單獨的表格並將它們合併爲一個表格。 這一切都假設您實際上有四個CPU內核可用於您的腳本。 – Mchl 2010-07-27 08:24:21

1

同時運行並不會幫助你,因爲插入本身是瓶頸。

如果您基於相同的查詢將數據插入表中,則可以進行幾次優化。但是,一般來說,插入代價昂貴,並且如果您有大量數據集,則需要時間。

  1. 如上所述,使用類似PDO的庫來利用預準備語句。
  2. 如果問題在於插入塊阻止相關Web應用程序的性能,那麼您可以通過將插入隊列排隊到某種類型的腳本中,從而將其中的一個塊作爲單個插入,如下所示:http://www.desilva.biz/mysql/insert.html

這些可能不會大量幫助,但他們可能會有所幫助。