首页 文章

SQLite更新ONE记录非常(相对)缓慢

提问于
浏览
1

在插入/更新许多行时,我知道SQLite的“问题”,但事实并非如此 .

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

为什么1个非常简单的 UPDATE 查询需要200毫秒?所有阅读都非常快速 .

我试过了:

  • BEGINCOMMIT - 没有变化,因为它只是一个声明

  • PRAGMA journal_mode=PERSIST - 没有变化,显然磁盘io不是问题?

  • 删除了 UPDATE 语句 - 这对于时间来说非常有用!但它不是很持久

要在同一系统上与MySQL进行比较: 0.6ms 在一个非常相似的数据库中 .

我没有_2548665_很好,失去了 all 的变化 . MySQL(InnoDB)有一个选项: innodb_flush_log_at_trx_commit . SQLite有类似的东西吗?

我正在使用sqlite-3.7.9,如果这很重要的话 .

2 回答

  • 0

    是的,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 是最快的,因为它根本不创建日志(?) .

  • 7

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

    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();
    

相关问题