在插入/更新许多行时,我知道SQLite的“问题”,但这不是这种情况。
我正在更新一行中的一个字段,由PK编制索引,在一个包含约250条记录的表中。查询总是需要大约200毫秒。这听起来很少,但它很大。
为什么1个非常简单的UPDATE
查询需要200毫秒?所有阅读都非常快速。
我试过了:
BEGIN
和COMMIT
- 没有变化,因为它只是一条陈述PRAGMA journal_mode=PERSIST
- 没有变化,显然磁盘不是问题吗?UPDATE
语句 - 这对于时间来说非常有用!但是它不是很持久与同一系统上的MySQL进行比较:在一个非常相似的数据库中 0.6ms 。
我不需要事务安全性(ACID?)或任何你称之为的东西。如果计算机在此查询期间崩溃,我可能会失去所有更改。 MySQL(InnoDB)有一个选项:innodb_flush_log_at_trx_commit
。 SQLite有类似的东西吗?
我正在使用sqlite-3.7.9,如果这很重要。
答案 0 :(得分:7)
是的,SQLite有一个像MySQL的innodb_flush_log_at_trx_commit
:
PRAGMA synchronous=OFF
它就像一个魅力。没有ACID,是的速度。出于某种令人难以置信的原因,UPDATE
现在需要< 1毫秒。
journal_mode
:
PRAGMA journal_mode=MEMORY
or
PRAGMA journal_mode=OFF
两者都非常快,而不是ACID。回滚不是问题,因此在这种情况下两者都很好。 OFF
是最快的,因为它根本不创建日记(?)。
答案 1 :(得分:0)
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();