2016-03-25 23 views
2

我有200萬行文本文件,並希望插入數據庫行中的每一行,所以,使用PHP文件插入到SQL Server 2000,000記錄。什麼是最快的方法呢?快速的方式來插入數百萬記錄到SQL服務器使用PHP

爲了測試我使用這個代碼:

for ($i=1 ; $i<=2000000 ; $i++) 
    { 
     $sql = "INSERT INTO BlastSequenceDim (Seq_id) VALUES ('$i')"; 
     $stmt = sqlsrv_query($conn, $sql); 
     if($stmt === false) 
     { 
      die(print_r(sqlsrv_errors(), true)); 
     } 
    } 

但是,它需要大量的時間。此查詢可以在幾秒鐘內執行嗎?

謝謝,

+0

這個文本文件包含什麼? –

+1

我不認爲有一種方法可以在通過連接和開銷相關聯的同時在幾秒鐘內插入200萬條記錄,但是一次插入批次而不是一次插入會更快。有關詳細信息,請參閱http://stackoverflow.com/questions/5526917/how-to-do-a-batch-insert-in-mysql。 – Technoh

+0

這不應該是一個真正的問題,可能幾秒鐘就可以運行它。 最快的方法是每塊多重插入,如果你可以.. – Loenix

回答

3

請使用批量插入這將顯着提高性能和節省時間。

切割出PHP和直接訪問SQL數據庫學習SQL

您還可以節省時間更多Bulk insert query,這將是常見的做法是首先填充分貝。

Another link

+0

您是否有這種批量插入的快速示例?我會閱讀鏈接,但如果你有一個簡單的例子,它會更好 – Alaa

+0

而不是複製粘貼示例。我寧願你閱讀下面的文章,它應該是你正在尋找的例子。 [鏈接] http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file –

+0

我想先測試它。我現在沒有文本文件。我的一個應用程序任務是生成此文本文件,然後將其插入到數據庫中。我現在處於測試階段。我想知道將數百萬條記錄插入到sql服務器需要多少時間。你可以在我的代碼中看到我只是插入「我」的值,因爲我在深入之前處於測試階段。 – Alaa

2

除單獨運行的每個查詢。將查詢連接在一起並一次運行。

for ($i=1 ; $i<=2000000 ; $i++) 
{ 
    $sql .= "INSERT INTO BlastSequenceDim (Seq_id) VALUES ('$i');"; 
} 

$stmt = sqlsrv_query($conn, $sql); 
if($stmt === false) 
{ 
    die(print_r(sqlsrv_errors(), true)); 
} 
+0

雖然這是一個解決方案,但有更有效的方法。 –

+0

@Ray我正在嘗試你的代碼,並得到這個錯誤:致命錯誤:在第106行的C:\ inetpub \ wwwroot \ webclient \ saveResult.php中,134217728字節允許的內存大小已耗盡(試圖分配225778224字節)。第106行:$ stmt = sqlsrv_query($ conn,$ sql); – Alaa

+0

@Alaa不是一個很好的解決方案 - 我會強烈地感到不適合實施它。該解決方案的結尾由文件的大小決定。你可以肯定增加PHP內存,但是什麼呢? –

0

通常的瓶頸是PHP沒有運行多線程。這意味着在你的情況下,一個進程是順序讀取文件並逐行插入,即使你的服務器/ PC有8個或更多核心。

我有同樣的問題,我不得不插入大量的值到memcache鍵,我解決了它與php pthread

確實有更多的工作,但是當它是一個重複的任務[就像我的情況],那麼絕對值得用pthread來實現它。

作爲提示,我會建議啓動線程的總數不應該>number_of_cpu_cores x 1.5。

只有一個問題:如何協調讀取文本文件。在這裏,我會考慮把兩個數字傳遞給每個線程:

  • 開始在行號X
  • 將被添加到X爲了你跳過被其他線程讀取行偏移。

您會對性能增益感到驚訝!結合它與您的問題的其他答案將是無與倫比的...

相關問題