SQLite更新一个记录是非常(相对)慢
在插入/更新许多行时,我知道SQLite的“问题”,但这不是这种情况。
我正在更新一行中的一个字段,由PK索引,放在一个有250条记录的表中。 查询总是需要〜200毫秒。 这听起来很少,但它很大。
为什么1个非常简单的UPDATE
查询需要200 ms? 所有的阅读都很快。
我试过了:
BEGIN
和COMMIT
- 没有变化,因为它只是一个声明 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