SQLite真的很慢

时间:2015-06-26 14:03:57

标签: c++ database macos performance sqlite

我一直在努力在我的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);

(为了简单起见,我更改了表和列的名称)。 此查询是一段时间,并且在同一事务中完成了很多次。选择查询大约需要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;

你能帮我修改数据库吗?我做错了什么?

1 个答案:

答案 0 :(得分:0)

选项第一: 是否有可能使用整数主键而不是字符串 - 它确实会杀死SELECT性能。

选项二: 表中有多少列,您在记录集中是否需要所有列?如果您可以节省阅读和复制数据,您可能会获得更好的结果。

选项三: 是否有可能重写由sqlite3_step而不是人工外部控制控制的循环?记录集上的迭代(偶尔跳过未使用的行)比每次重新选择新的记录集要好得多。将数据保存到地图中表明这应该是可能的。