使用PHP在一个查询MySQL中插入数千行

时间:2016-10-25 17:39:28

标签: php mysql prepared-statement

我已经尝试了一整天(再次)但是在一次查询中插入大约10k的同时错误地尝试插入总共超过十亿行。我想使用预制语句使用innoDB表来使用MySQL。硬件资源不是问题,问题一直是索引和一行/插入。

不要说我应该直接使用list方法,因为我需要在插入之前进行一些计算。输入来自文件。

所以我有一个很大的while循环,循环文本文件行,并且工作正常。 我目前这样做,每个查询插入一个。

    $stmt = $conn->prepare("INSERT INTO $tableName(row1, row2, row3) VALUES (?, ?, ?)");
    $stmt->bind_param("sss", $str1, $str2, $str3);
    $stmt->execute();

我看过这样做的例子:

$stmt = $conn->prepare("INSERT INTO $tableName(row1, row2, row3) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?), (?, ?, ?) ..... ");

但我需要将其构造为5-10k行以进行单个查询。

如果有人之前做过类似的事情,请提供一些参考资料。

提前致谢!

2 个答案:

答案 0 :(得分:6)

prepared query的整个想法是,它减少了每次运行时设置查询的开销 - 准备一次,重复执行。这意味着在循环中运行预准备语句或传递一个巨大查询之间不会产生大量差异(来自数据库的POV)。

您不会在此处包含您的整个代码,但许多人犯的错误是在循环中包含语句准备。别犯这个错误!这样的事情将是最有效的:

// these need a value before being used in bind_param
$str1 = $str2 = $str3 = "";
$stmt = $conn->prepare("INSERT INTO $tableName(row1, row2, row3) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $str1, $str2, $str3);
while ($we_have_data) {
    $str1 = "foo";
    $str2 = "bar";
    $str3 = "baz";
    $stmt->execute();
}

虽然我总是建议使用PDO prepared statements,但是为了避免潜在的绑定参数混乱:

// assuming $conn is a PDO object now
$stmt = $conn->prepare("INSERT INTO $tableName(row1, row2, row3) VALUES (?, ?, ?)");
while ($we_have_data) {
    $str1 = "foo";
    $str2 = "bar";
    $str3 = "baz";
    $stmt->execute([$str1, $str2, $str3]);
}

答案 1 :(得分:0)

可能是因为限制了服务器的执行时间。尝试使用插入批处理。 添加到数组

d