如何优化使用 pdo 插入数据时的执行次数?

How to optimize the times of execute when to insert data with pdo?

有一个巨大的二维数组,包含500k个子一维数组,每个子数组包含5个元素。 现在我的工作是将所有数据插入到 sqlite 数据库中。

function insert_data($array){
    Global $db;
    $dbh=new PDO("sqlite:{$db}");
    $sql = "INSERT INTO quote (f1,f2,f3,f4,f5) VALUES (?,?,?,?,?)";
    $query = $dbh->prepare($sql);
    foreach($array as $item){
        $query->execute(array_values($item));
            }
    $dbh=null;
        }

我想优化数据插入过程,执行动作会执行500k次,如何让它只执行一次?

这个想法是为了防止每个插入的 运行 个事务,因为它确实会非常慢。所以只需开始并提交事务,比如每 10k 条记录。

$dbh->beginTransaction();
$counter = 0;
foreach($array as $item) {
    $query->execute(array_values($item));
    if ($counter++ % 10000 == 0) {
        $dbh->commit();
        $dbh->beginTransaction();
    }
}
$dbh->commit();

另一种解决方案,您可以在 csv 文件中移动一个数组,然后将其导入。

如果您使用的是较新版本的 Sqlite (3.7.11+),那么它支持批量插入:

INSERT INTO quote (f1,f2,f3,f4,f5) VALUES
  (?,?,?,?,?),
  (?,?,?,?,?),
  (?,?,?,?,?);

您可以使用它来将数组分块成组,并以这种方式进行批量插入。 正如 所指出的,您还应该将整个操作包装在一个事务中。