SQLite更新一个记录是非常(相对)慢

在插入/更新许多行时,我知道SQLite的“问题”,但这不是这种情况。

我正在更新一行中的一个字段,由PK索引,放在一个有250条记录的表中。 查询总是需要〜200毫秒。 这听起来很少,但它很大。

为什么1个非常简单的UPDATE查询需要200 ms? 所有的阅读都很快。

我试过了:

  • BEGINCOMMIT - 没有变化,因为它只是一个声明
  • PRAGMA journal_mode=PERSIST - 没有改变,显然磁盘io不是问题?
  • 删除UPDATE语句 - 这对于时间来说非常有用!但它不是非常持久
  • 与同一系统上的MySQL进行比较:在非常相似的数据库中为0.6ms

    我不需要交易安全(ACID?)或任何你称之为的东西。 如果在查询过程中计算机崩溃,我很失败所有更改。 MySQL(InnoDB)有一个选项: innodb_flush_log_at_trx_commit 。 SQLite有类似的东西吗?

    我正在使用sqlite-3.7.9,如果这很重要。


    是的,SQLite有一个选项,如MySQL的innodb_flush_log_at_trx_commit

    PRAGMA synchronous=OFF
    

    它就像一个魅力。 没有ACID,是速度。 出于一些令人难以置信的原因, UPDATE现在需要<1ms。

    还有一些改进的journal_mode

    PRAGMA journal_mode=MEMORY
    or
    PRAGMA journal_mode=OFF
    

    两者速度都很快,而不是ACID。 回滚不是问题,所以在这种情况下两者都很好。 OFF是最快的,因为它根本不创建日志(?)。


    SQLite是处理轻量级数据集的好选择。 是的,在插入/更新数据时,它比任何数据库要慢得多。 可以通过自己提交查询来加速这些操作。请通过下面的演示代码。 我已经用JDBCTemplate Spring框架引用了JAVA代码来执行我的数据库操作。 请使用try-catch bolck处理所需的例外情况

    conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
    conn.setAutoCommit(false);
    PreparedStatement stmt = conn.prepareStatement(query_string);
    for(Object[] temp:argsListForInsertQuery)
    {
        stmt.setString(1, (String)temp[0]);
        stmt.setString(2, (String)temp[1]);
        stmt.setString(3, (String)temp[2]);
        stmt.setString(4, (String)temp[3]);
        stmt.addBatch();
     }
     stmt.executeBatch();
     conn.commit();
     conn.setAutoCommit(true);
     conn.close();
    
    链接地址: http://www.djcxy.com/p/19817.html

    上一篇: SQLite updating ONE record is very (relatively) slow

    下一篇: SQLite insert :memory: performance