2016-04-26 50 views
0

有兩個提示: 1.使用php讀取文件並將數據插入數據庫; 2.使用「LOAD DATA INFILE」的sql語句讀取文件並將數據插入到數據庫中。 結果是,提示一需要很多時間來完成這項工作,但提示二,它只需要幾秒鐘完成。 所以問題是,這兩個技巧有什麼區別? 這是關於php和sql的基本設計或理論原理嗎? 如果是,那是什麼?php和sql的區別?

+0

的PHP的版本是5.3,而數據庫的類型是MySQL和5.5版本。 – James

回答

0

這取決於你如何做PHP版本。這裏有幾個選項,每個選項都具有不同的性能級別。

通過像DoctrinePropel的ORM去會給你很多在每個記錄控制,並會公開一個友好的界面,但它是最慢的方法。每條記錄通常都經過驗證,所以您確實擁有這種安全性,但是如果數據已經知道,那麼有更好的方法。

使用由您的ORM或通過類似PDO提供的原始數據庫適配器通常速度更快,尤其是如果您可以使用準備好的語句並使用不同的數據值重複執行相同的INSERT語句。

最有效的PHP驅動的方法是構造一個帶有多個值集的大型INSERT語句,即所謂的「多插入」,它通常每次以1000或更多行的塊形式添加數據,具體取決於每一行都很大。通過正確的服務器調整,這樣的性能可能會非常接近最佳狀態,在這種情況下,您可能會付出30-50%的懲罰,而不是理論上最快的懲罰。有時候這是一個合理的折衷。

LOAD DATA INFILE方法將永遠是最快的,因爲MySQL有一些內部優化來處理它。這確實要求您直接在數據庫服務器上以可讀的格式存儲文件,因此它也是最受限制的。您還負責確保數據正確並適合您的架構,否則可能會發生無意中截斷。沒有數據驗證完成,無效的日期可能會導致問題,如0000-00-00

因此,所有這些方法都視情況而定。如果您需要速度,LOAD DATA方法將始終最快,但這不是沒有風險。

從公式中刪除PHP可減少開銷。在磁盤上使用文件可以避免網絡堆棧和MySQL網絡協議的開銷。這兩種方法的成本相當低,所有事情都考慮到了,但是它們非常重要,特別是當您試圖在裝備快速運行的系統上插入大量數據時。

+0

php的版本是5.3。 – James

+0

你的意思是php驗證每一個聲明? – James

+0

ORM將執行諸如驗證名稱已填充或密碼中包含數字之類的事情,這在處理髒數據時可能很重要。低級別的PHP不會做太多的驗證,但它將不得不做一些編碼和轉義。從一個文件幾乎是原始的,應用的處理很少。 – tadman

1

在第一種方法中,php代碼將驗證它將要插入的每個值(即,e)如果要插入數字值,將檢查它是否是純數字(取決於所用腳本中的編程邏輯)

正如您在提示中提到的那樣,如果它將要插入到數據庫中,必須獲得與數據庫的連接。 得到連接後,它必須執行語句(上述解析將發生在數據庫服務器(根據數據庫服務器的編碼邏輯),這增加了開銷)

Php將等待每一個插入語句發送到數據庫服務器(如果它是您的插入算法)。它是應用服務器數據庫服務器應用服務器邏輯,它增加了一些更多的延遲。

在DB服務器的情況下,它僅僅是中插入任何數量多所以應該早於PHP

+0

雖然關於驗證的評論並不總是正確的,但許多PHP程序只是逃脫並通過電線激發它,而不管MySQL是否將其整理出來,延遲觀察實際上在這裏非常相關。 – tadman

+0

正如我所說的這一切都依賴於PHP腳本的設計邏輯,除此之外,應用服務器到數據庫服務器到應用服務器添加了一些頭頂的PHP插入 –

+0

所以原因是,PHP需要連接到數據庫,並將創建每一個插入語句的每一個線程?但是當我一起插入語句時,它仍然需要很多時間來執行。 – James