我正在尝试通过导入带有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文件的两倍多。有什么方法可以减少吗?
答案 0 :(得分:5)
将缓存大小增加到足以包含内存中所有数据的大小。页面大小和缓存大小的默认值相对较小,如果这是桌面应用程序,则可以轻松地多次增加缓存大小。
PRAGMA page_size = 4096;
PRAGMA cache_size = 72500;
会给你一个不到300mb的缓存大小。请记住,必须在创建数据库之前设置页面大小。默认页面大小为1024,默认缓存大小为2000。
或者(或几乎相当),您可以完全在内存数据库中创建数据库,然后使用备份API将其移动到磁盘数据库。
答案 1 :(得分:3)
PRIMARY KEY
或UNIQUE
约束将自动生成索引。索引会显着加快SELECT
s,但会降低INSERT
的速度。
尝试将数据导入非索引表,然后然后明确地CREATE UNIQUE INDEX _index_name ON urltable(url)
。一次构建索引可能比一次构建索引更快。