2011-06-10 38 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导入数据库。