在SQLite中从单个列查询多个值的最有效方法是什么?

时间:2017-05-16 21:45:11

标签: python sqlite hash

我在SQLite中有一个用来存储哈希的数据库。通常,我需要对大约2000万个哈希的数据集进行超过十万个哈希的查询。数据库中有几个表包含这些表,其中一些表应该有数百万个哈希值。每个表都具有相同的结构。

例如,

(class_name, class_description, score)

目前,我的代码(Python)读入输入文本文件并创建比较哈希列表。然后将列表中的哈希值创建为一个集/列表(忘记它在SQL中的技术上称为什么)。然后,对于数据库中的每个表,创建类似于以下内容的查询并将其添加到列表中。

ID,md5,sha1,source

0,abcd1234...,abcd4321...,bills_hashes

1,cdef5678...,cdef8765...,bobs_hashes

通常有大约12个表,因此大约有12个查询被添加到列表中。然后执行所有12个查询,并对所有生成的返回行进行整理,然后进行处理。

我遇到的问题是查询/结果收集花费了很长时间来处理更大的数据集。一旦我得到超过50,000个哈希值,有时候需要几个小时。数据库中的哈希列已编制索引。

如何改进查询以加快回报速度,以便快速处理这些数据(可能)?我使用sqlite3模块和Python 2.7来执行这些操作。

1 个答案:

答案 0 :(得分:2)

这似乎是一个表结构问题而不是查询问题。

首先,zacks_tablegregs_table这样的表名通常表示确实应该有一个以username为列的单个表。

如果您的输入是~100K哈希,我会先将它们插入临时表中,例如:

create temp table inputhash (hash varchar primary key)

然后一次性插入所有输入哈希值:

c.execute("insert into inputhash (hash) values (?)", [(hash1,), (hash2,),...])

现在您可以使用更小的选择获得结果:

select * 
from zacks_table zack
join inputhash inpt on zack.md5 = inpt.hash

如果您已经创建了一个数据表,其中包含用户名作为您可以执行的列

select * 
from data_table data
join inputhash inpt on data.md5 = inpt.hash 
 and data.username in ('zack', 'greg')