具有数百万'url'字符串的sqlite数据库设计 - 从csv缓慢批量导入

时间:2011-06-04 21:01:25

标签: search sqlite

我正在尝试通过导入带有url的csv文件来创建sqlite数据库。该文件有大约600万字符串。这是我用过的命令

create table urltable (url text primary key);
.import csvfile urldatabase

在大约300万网址后,速度减慢很多,我的硬盘不断旋转。我已经尝试将csv文件拆分为1/4块但我遇到了同样的问题。

我在stackoverflow上阅读了类似的帖子,尝试使用BEGIN...COMMIT块和PRAGMA synchronous=OFF,但没有一个帮助。我能够创建数据库的唯一方法是从url中删除主键约束。但是,当我运行一个select命令来查找特定的url时,需要2-3秒,这对我的应用程序不起作用。 在url上设置主键时,选择是即时的。请告诉我我做错了什么。

[编辑] 有帮助的建议摘要:

  • 减少交易次数
  • 增加页面大小&缓存大小
  • 稍后添加索引
  • 从网址中删除冗余

但是,对于主索引,数据库大小是我尝试导入的原始csv文件的两倍多。有什么方法可以减少吗?

2 个答案:

答案 0 :(得分:5)

将缓存大小增加到足以包含内存中所有数据的大小。页面大小和缓存大小的默认值相对较小,如果这是桌面应用程序,则可以轻松地多次增加缓存大小。

PRAGMA page_size = 4096;
PRAGMA cache_size = 72500;

会给你一个不到300mb的缓存大小。请记住,必须在创建数据库之前设置页面大小。默认页面大小为1024,默认缓存大小为2000。

或者(或几乎相当),您可以完全在内存数据库中创建数据库,然后使用备份API将其移动到磁盘数据库。

答案 1 :(得分:3)

PRIMARY KEYUNIQUE约束将自动生成索引。索引会显着加快SELECT s,但会降低INSERT的速度。

尝试将数据导入非索引表,然后然后明确地CREATE UNIQUE INDEX _index_name ON urltable(url)。一次构建索引可能比一次构建索引更快。