在php中添加数据库的最佳multiInsert方式?

时间:2015-11-13 22:28:15

标签: php mysql pdo

如何以最佳方式添加到数据库multiInsert行?
例如,我有数组,我想将所有数组添加到数据库。我可以创建循环foreach并添加所有数组。

Android Studio

它的工作,但也许我应该使用交易?还是以别的方式呢?

2 个答案:

答案 0 :(得分:1)

使用准备好的陈述。

$sql = "INSERT INTO test (fruit) VALUES ";
$sql .= implode(', ', array_fill(0, count($array), '(?)'));
$stmt = $db->prepare($sql);
$stmt->execute($array);

SQL将如下所示:

INSERT INTO test (fuit) VALUES (?), (?), (?), ...

其中(?)$array中的元素数量相同{。}}。

使用多个VALUES执行单个查询比在循环中执行单独查询更有效。

如果您有一个包含单行输入值的关联数组,则可以使用这样的预准备查询:

$columns = implode(',', array_keys($array);
$placeholders = implode(', ', array_fill(0, count($array), '?'));
$sql = "INSERT INTO test($columns) VALUES ($placeholders)";
$stmt = $db->prepare($sql);
$stmt->execute(array_values($array));

答案 1 :(得分:1)

在许多方面,你做这件事的方式是最糟糕的选择。所以好消息是,任何其他方式都可能会更好。就目前而言,代码可能会失败,具体取决于数据中的内容;考虑:

$v="single ' quote";
$stmt = $db->exec("Insert into test(fruit) VALUES ('$v')");

但不知道你的标准是什么,最好的#34;它很难建议。使用带有数据绑定的参数化查询,或者经常描述的#34;准备好的语句"是上述问题的一种解决方案。在插入字符串之前将值正确地转义是另一个(并且大多数PHP实现的数据绑定在幕后工作)是另一种常见的解决方案。

不考虑如何将参数输入SQL语句的问题,那么就存在性能问题。每次到数据库的往返都有与之相关的成本。并且一次执行单个插入也会对性能产生影响 - 对于每个查询,DBMS必须解析查询,应用适当的并发控制,执行查询,将写入应用于日志,然后应用于数据表和索引在它将执行线程返回给PHP以构造下一个查询之前整理一下。

在事务中包装多个查询(您已经使用了事务 - 但它们是隐式的并应用于每个语句)可以减少我在此描述的一些开销,但可能会引入其他问题,其性质取决于哪个您的DBMS使用的并发模型。

为了尽可能快地将数据导入数据库,并最大限度地减少索引碎片,最好的"解决方案是批处理多个插入:

$q="INSERT INTO test (fruit) VALUES ";
while (count($array)) {
    $s=$q;
    $j='';
    for ($x=0; $x<count($array) && $x<CHUNKSIZE; $x++) {
         $s.=$j." ('" . mysqli_real_escape_string($db,
            array_shift($array)) . "')";
         $j=',';
    }
    mysqli_query($db,$s);
}

这类似于Barmar的方法,但我认为当您处理更复杂的记录结构时更容易理解,并且它不会打破非常大的输入集。