如何在没有事务的情况下提升PDO SQLite插入?

时间:2016-08-20 01:50:36

标签: php pdo sqlite

有以下模拟INSERT查询,这看起来非常慢!

$sqlite = new \PDO();
for($i=0;$i<100;$i++) {
  $sqlite->prepare('INSERT INTO test (`id`, `data1`, `data2`) VALUES (:id, :data1, :data2);');
  $sqlite->execute(array(
    ':id' => NULL,
    ':data1' => 'some string',
    ':data2' = 'some string'
    // And more
  ));
}

以23.261秒(4.3 q / s)执行100次插入

设置pragma synchronous = off;

$sqlite->exec("pragma synchronous = off;");

以0.037秒(2704.7 q / s)执行100次插入

  • pragma synchronous = off可能有哪些副作用?
  • 据我所知,瓶颈是fsync,对吧?
  • 还有其他方法可以加速SQLite而不使用事务来查询查询吗?

1 个答案:

答案 0 :(得分:1)

documentation记录副作用:

  

在同步OFF(0)的情况下,SQLite一旦将数据传递给操作系统,就会继续进行同步。如果运行SQLite的应用程序崩溃,则数据将是安全的,但如果操作系统崩溃或计算机在将数据写入磁盘表面之前断电,则数据库可能会损坏。另一方面,同步OFF时,提交速度可以提高几个数量级。

使用单个事务是快速插入多行的唯一安全方法。就这么做。