我正在将csv文件导入mysql数据库。还没有看过批量插入,但是想知道通过循环遍历值来构造一个大量的INSERT语句(使用PHP)是否更有效?或者单独插入CSV行更有效吗?
答案 0 :(得分: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直接进入数据库。
答案 1 :(得分:3)
我不知道PHP如何与mySQL建立连接的具体细节,但是每个插入请求都会在插入本身的数据之外产生一些开销。因此,我认为批量插入比重复数据库调用更有效。
答案 2 :(得分:1)
如果不知道至少两个元素,很难给出答案:
1)您的数据库是否在运行PHP代码的同一台服务器上运行?
2)文件的“大”程度如何?即平均20 csv记录? 200? 20000?
通常循环遍历csv文件并为每一行触发一个insert语句(但请使用prepared statements,否则你的数据库将花费时间每次解析相同的字符串)将更“传统”除非你在PHP和数据库之间建立一个非常慢的连接,否则它会非常有效。
即使在这种情况下,如果csv文件的记录长度超过20条,您可能会从SQL解析器开始遇到max语句长度问题。