与anydbm相比,使用Python的sqlite速度慢得不合理

与anydbm相比,使用Python的sqlite速度慢得不合理,python,performance,sqlite,dbm,Python,Performance,Sqlite,Dbm,我的目标是创建一个包含MD5哈希的数据库,然后对照它检查另一个哈希列表,看看数据库中是否存在这些哈希 我有一个使用anydbm的有效解决方案,如果您不熟悉该解决方案,它的工作原理与python中的字典完全相同,但您不必立即将整个内容加载到内存中。数据库的创建相当慢(大约2个半小时内有1亿个条目),检索速度适中(1到2秒钟内有10万个条目)。检查哈希是否存在就像在dbm中检查哈希一样简单 为了提高性能,我尝试用sqlite制作一个有效的解决方案。创建速度极快,在几分钟内创建了所有1亿个条目。但检索

我的目标是创建一个包含MD5哈希的数据库,然后对照它检查另一个哈希列表,看看数据库中是否存在这些哈希

我有一个使用
anydbm
的有效解决方案,如果您不熟悉该解决方案,它的工作原理与python中的字典完全相同,但您不必立即将整个内容加载到内存中。数据库的创建相当慢(大约2个半小时内有1亿个条目),检索速度适中(1到2秒钟内有10万个条目)。检查哈希是否存在就像在dbm中检查哈希一样简单

为了提高性能,我尝试用sqlite制作一个有效的解决方案。创建速度极快,在几分钟内创建了所有1亿个条目。但检索一个条目需要15秒以上的时间。这是不合理的

我不是一个SQL专业人士,所以我想知道我是否只是在使用那些过于复杂的命令

详情如下:

创建表:
c.execute(“'create table keys(id integer not null主键自动递增,散列文本,警报文本)”)

添加条目(在循环中):
c.execute(''insert-into-keys(hash,alert)值(?,)'',(hash,1”)

检索(也循环):


您必须在md5表上创建一个索引—无论哈希是否唯一—没有索引意味着线性访问会在每次访问时抛出所有记录

看看这些文档,创建索引似乎和发布索引一样简单
在数据库的键上创建索引散列(hash)

您必须在md5表上创建索引-无论散列是否唯一-没有索引意味着线性访问会在每次访问时抛出所有记录

看看这些文档,创建索引似乎和发布索引一样简单
在数据库的键上创建索引哈希(哈希)

sqlite不用于性能。从非索引、非唯一字段执行
选择*
,会导致数据库扫描查询表中的每条记录,而基于散列的具有唯一键的查找(如dictionary/
anydbm
key:value-store)只会将每个键存储一次,因此只需要找到一条记录。正如@卡斯滕所说,您需要使用索引来更快地查询(并且考虑如果可能的话添加一个唯一的约束)。MD5散列在源文档中不是唯一的,但是我不一定需要保存每个条目。有没有一种方法可以设置它,使散列是唯一的,但如果我尝试添加一个重复的,它会忽略op?我没有使用这个子句,但它看起来像您需要的:。。。使用IGNORE语句SQLite不是为了性能。从非索引、非唯一字段执行
select*
操作会导致数据库扫描查询表中的每条记录,而使用唯一键(如dictionary/
anydbm
key:value store)的基于哈希的查找只会将每个键存储一次,因此只需要找到一条记录。正如@卡斯滕所说,您需要使用索引来更快地查询(并且考虑如果可能的话添加一个唯一的约束)。MD5散列在源文档中不是唯一的,但是我不一定需要保存每个条目。有没有一种方法可以设置它,使散列是唯一的,但如果我尝试添加一个重复的,它会忽略op?我没有使用这个子句,但它看起来像您需要的:。。。使用IGNORE语句
c.execute('''select * from keys where hash = ? ''', (hash,))
hits = c.fetchall() 
numhits += len(hits)