如何优化使用 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
(?,?,?,?,?),
(?,?,?,?,?),
(?,?,?,?,?);
您可以使用它来将数组分块成组,并以这种方式进行批量插入。
正如 所指出的,您还应该将整个操作包装在一个事务中。
有一个巨大的二维数组,包含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
(?,?,?,?,?),
(?,?,?,?,?),
(?,?,?,?,?);
您可以使用它来将数组分块成组,并以这种方式进行批量插入。
正如