我正在使用Qt database abstraction图层与Sqlite3进行交互。
int x = GetTickCount();
database.exec("UPDATE controls SET dtype=32 WHERE id=2");
qDebug() << GetTickCount()-x;
表格是:
CREATE TABLE controls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
internal_id TEXT,
name TEXT COLLATE NOCASE,
config TEXT,
dtype INTEGER,
dconfig TEXT,
val TEXT,
device_id INTEGER REFERENCES devices(id) ON DELETE CASCADE
);
结果更新时间约为100毫秒!即使没有其他任何东西正在访问数据库,并且该表中总共有3条记录。
这对我来说似乎很荒谬。 10条记录已经需要一秒钟才能完成。这是我应该从sqlite中获得的性能还是让我搞砸到某个地方的东西? SELECT查询足够快〜1ms。
<小时/> 修改1
所以这不是Qt。
sqlite3 *db;
if ( sqlite3_open("example.db",&db ) != SQLITE_OK )
{
qDebug() << "Could not open";
return;
}
int x = GetTickCount();
sqlite3_exec(db, "UPDATE controls SET dtype=3 WHERE id=2",0,0,0);
qDebug() << "Took" << GetTickCount() - x;
sqlite3_close(db);
这家伙花了相同的时间。
答案 0 :(得分:5)
当您访问硬盘时,可能需要很长时间。
尝试以下方法之一:
PRAGMA journal_mode = memory;
PRAGMA synchronous = off;
因此它不会立即触及磁盘。
如果使用得好,SQLite可以非常快。您可以从缓存中回答小型数据库的select语句。
还有其他方法可以调整您的数据库。看到这样的其他问题: Improve INSERT-per-second performance of SQLite?