2011-06-10 41 views

回答

1

這是很難給出一個答案不知道至少有兩個以上的元素:

1)您的數據庫在PHP代碼運行在同一臺服務器上運行?

2)文件的大小是多少?即平均20 csv記錄? 200? 20000?

在一般情況下,循環播放csv文件併爲每行啓動插入語句(請使用prepared statements,或者DB每次花費時間解析相同的字符串)將是更傳統的方法,除非在PHP和數據庫之間有一個非常緩慢的連接,否則要足夠高效。

即使在這種情況下,如果csv文件超過20條記錄長度,您可能會從SQL解析器開始遇到最大語句長度問題。

+0

我一直在使用一次插入多達2000行的語句成功。實際上,沒有「max語句長度」這樣的事物,只有[max_allowed_pa​​cket](http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_pa​​cket) my.cnf中的指令直接限制語句長度。 – cypher 2011-06-10 13:06:43

+0

決定使用具有多個插入的準備好的語句。運作良好。試用了10K行的CSV。 – samxli 2011-06-12 16:32:23

3

我不知道PHP如何與mySQL建立連接的細節,但是每個插入請求都會有一些超出插入數據的開銷。因此我會想象一個批量插入比重複的數據庫調用要有效得多。

4

批量插入要快得多。我通常會做這樣的事情,一次導入100條記錄(100條記錄的批量大小是任意的)。

$a_query_inserts = array(); 
$i_progress = 0; 

foreach($results as $a_row) { 

    $i_progress++; 
    $a_query_inserts[] = "({$a_row['Column1']}, {$a_row['Column2']}, {$a_row['Column3']})"; 

    if(count($a_query_inserts) > 100 || $i_progress >= $results->rowCount()) { 

     $s_query = sprintf("INSERT INTO Table 
      (Column1, 
      Column2, 
      Column3) 
      VALUES 
      %s", 
      implode(', ', $a_query_inserts) 
     ); 
     db::getInstance()->query($s_query); 

     // Reset batch 
     $a_query_inserts = array(); 
    } 
} 

還有一種方法可以直接將load the file導入數據庫。