【发布时间】:2011-06-04 21:01:24
【问题描述】:
我正在尝试通过导入带有 url 的 csv 文件来创建一个 sqlite 数据库。该文件有大约 600 万个字符串。这是我用过的命令
create table urltable (url text primary key);
.import csvfile urldatabase
大约 300 万个 url 之后,速度变慢了很多,我的硬盘一直在旋转。我尝试将 csv 文件拆分为 1/4 块,但遇到了同样的问题。
我在 stackoverflow 上阅读了类似的帖子,并尝试使用 BEGIN...COMMIT 块和 PRAGMA synchronous=OFF,但它们都没有帮助。我能够创建数据库的唯一方法是从 url 中删除 primary key 约束。但是,当我运行选择命令来查找特定 url 时,需要 2-3 秒,这对我的应用程序不起作用。
在 url 上设置主键后,选择是即时的。请告诉我我做错了什么。
[编辑] 有帮助的建议摘要:
- 减少交易次数
- 增加页面大小和缓存大小
- 稍后添加索引
- 从 url 中删除冗余
尽管如此,使用主索引,数据库大小还是我尝试导入的原始 csv 文件的两倍多。有什么办法可以减少吗?
【问题讨论】:
-
尝试使用 url 的哈希创建另一列并使其唯一。
-
如果数据不必是唯一的,为什么不给url列添加一个常规索引呢?
-
@JohnRoss :关于您的第一条评论,如果我将哈希列设为唯一,我将如何处理哈希冲突?关于第二条评论,url数据是唯一的。
-
如果你知道输入数据是唯一的,为什么要让数据库在插入时验证呢?如果您选择具有良好熵的散列算法,例如 SHA1,您可能不会遇到冲突。我正在考虑插入时必须检查的内容,当您的所有输入都以
http://www.开头时,这是 11 个字符,否则在检查每个插入的有效性时可能会被忽略。 -
@JoshRoss 不错的建议,就我而言,我可以拆分网址并忽略公共部分。