我在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来执行这些操作。
答案 0 :(得分:2)
这似乎是一个表结构问题而不是查询问题。
首先,zacks_table
和gregs_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')