首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数百万“url”字符串的sqlite数据库设计-从csv缓慢批量导入

使用数百万“url”字符串的sqlite数据库设计-从csv缓慢批量导入
EN

Stack Overflow用户
提问于 2011-06-04 21:01:24
回答 2查看 1.1K关注 0票数 4

我试图通过导入带有urls的csv文件来创建sqlite数据库。该文件大约有600万个字符串。下面是我用过的命令

代码语言:javascript
复制
create table urltable (url text primary key);
.import csvfile urldatabase

在大约300万urls之后,速度慢了很多,我的硬盘也在不停地旋转。我尝试将csv文件分割成1/4块,但遇到了同样的问题。

我在堆栈溢出上读到了类似的文章,并尝试使用BEGIN...COMMIT块和PRAGMA synchronous=OFF,但它们都没有帮助。创建数据库的唯一方法是从url中删除主键约束。但是,当我运行select命令来查找特定的url时,需要2-3秒,这对我的应用程序来说是行不通的。在url上设置主键时,选择是瞬时的。请告诉我我做错了什么。

编辑帮助建议摘要:

  • 减少事务数
  • 增加页面大小和缓存大小
  • 添加索引
  • 从url

F 216删除冗余

不过,对于主索引,数据库大小是我试图导入的原始csv文件的两倍多。有办法减少吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-04 21:11:24

PRIMARY KEYUNIQUE约束将自动生成索引。一个指数将大大加快SELECT的速度,而代价是降低INSERT的速度。

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-04 22:06:09

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

代码语言:javascript
复制
PRAGMA page_size = 4096;
PRAGMA cache_size = 72500;

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6239376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档