【发布时间】:2015-06-26 14:03:57
【问题描述】:
我一直在努力让我的 C++ 程序中的 sqlite 更快。我认为结果与预期的结果相去甚远。
我在数据库中有几张表,其中大部分有几条记录,而一张有大量记录 (4986450)。达到这个大小真的很难,因为每个事务的插入太多,而且插入速度很慢。
另一方面,现在我正在对那个大表进行一个简单的查询,例如
sqlite3_prepare_v2(db,"SELECT * FROM Table where primary_key=?1;",-1, &query,NULL);
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg);
....
while(running){
sqlite3_bind_text(query, 1, pkey.c_str(), (int)pkey.size() , SQLITE_STATIC);
int query_status = sqlite3_step(query);
if(query_status == SQLITE_ROW){
data = sqlite3_column_int(query,1);
(... just saving data in a map)
}
}
sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg);
(为了简单起见,我更改了表和列的名称)。 此查询在一段时间内进行,并且在同一事务中执行了很多次。选择查询 500 次大约需要 9 秒。即使我将数据插入表中,我也可以获得更好的时间。
我在数据库中有以下编译指示
PRAGMA main.page_size = 4096;
PRAGMA main.cache_size=10000;
PRAGMA main.locking_mode=EXCLUSIVE;
PRAGMA main.synchronous=OFF;
PRAGMA main.journal_mode=WAL;
PRAGMA main.cache_size=5000;
你能帮我调整数据库吗?我做错了什么?
【问题讨论】:
-
出于好奇,
(... just saving data in a list)被全部注释掉时的表现如何? -
@WhozCraig 对不起,我的意思是地图。它几乎需要同样的时间。
-
@Siguza 谢谢你的帖子。我已经应用了大部分建议,但结果仍然相同:/
-
您确定该列是主键吗?显示EXPLAIN QUERY PLAN的输出。
标签: c++ database macos performance sqlite