数百万条目的SQLite优化?

Vol*_*Rig 4 sqlite optimization perl berkeley-db

我正在尝试使用SQLite数据库和Perl模块来解决问题.最后,我需要记录数以千万计的条目.每个项目唯一的唯一标识符是URL的文本字符串.我想以两种方式做到这一点:

方式#1:有一个好桌子,坏桌子,未分类的桌子.(我需要查看html并确定是否需要它.)假设我们总共有10亿个页面,每个表格中有3.33亿个URL.我有一个要添加的新URL,我需要检查它是否在任何表中,如果它是唯一的,则将其添加到Unsorted.另外,我会用这个选项移动很多行.

方式#2:我有2张桌子,Master和Good.Master拥有全部10亿个页面URL,而Good拥有我想要的3.33亿个页面URL.新的URL,需要做同样的事情,除了这次我只查询一个表,我永远不会从Master中删除一行,只将数据添加到Good.

所以基本上,我需要知道最好的设置,以快速查询一个巨大的SQLite数据库,看看大约20个字符的文本字符串是唯一的,然后添加,如果不是.

编辑:我现在正试图让Berkeley DB使用Perl模块工作,但没有骰子.这就是我所拥有的:

use BerkeleyDB;

$dbFolder = 'C:\somedirectory';
my $env = BerkeleyDB::Env->new ( -Home => $dbFolder );

my $db  = BerkeleyDB::Hash->new (
-Filename => "fred.db", 
-Env => $env );
my $status = $db->db_put("apple", "red");
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到以下内容:

Can't call method "db_put" on an undefined value at C:\Directory\perlfile.pl line 42, <STDIN> line 1.
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 5

我倾向于使用哈希而不是SQLite来做你想做的事情.散列被优化以测试存在,而不需要以任何排序顺序保持值,并且不需要在索引中保留数据的冗余副本.应用于数据的哈希算法产生存储它的位置(如果存在的话); 你可以寻找那个位置,看看它是否在那里.我认为您不需要将哈希表保留在RAM中.

以下是您可以采用混合哈希/ SQLite方法的方法.

创建一个SQLite表

STORE
id INTEGER PRIMARY KEY
BUCKET (integer, indexed) 
URL (text, not indexed)
status 
Run Code Online (Sandbox Code Playgroud)

如果你想让它们按状态分开,你可以有三个这样的表,STORE1,STORE2和STORE3.

我们假设每个商店中将有250,000,001个不同的桶.(您可以尝试使用此数字;将其设为素数).

找到一个带有两个输入的散列算法,即URL字符串和250,000,0001,并返回1到250,000,001之间的数字.

获取URL后,将其提供给散列算法,它将告诉您要查看哪个BUCKET:

从STORE中选择*,其中BUCKET = {哈希函数返回的值}.

BUCKET字段上的索引将快速返回行,您可以检查URL.如果当前URL不是其中之一,请添加它:

INSERT STORE(BUCKET, URL) VALUES( {your hash return value}, theURL). 
Run Code Online (Sandbox Code Playgroud)

SQLite将索引整数值,我认为这将比索引URL更有效.并且URL将仅存储一次.

  • 我认为答案长度没有实际限制.它肯定需要几个KB ... (2认同)