构造大量的insert语句或许多insert语句是否更有效?

时间:2011-06-10 12:33:25

标签: php mysql insert

我正在将csv文件导入mysql数据库。还没有看过批量插入,但是想知道通过循环遍历值来构造一个大量的INSERT语句(使用PHP)是否更有效?或者单独插入CSV行更有效吗?

3 个答案:

答案 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语句长度问题。