让SQLite运行SELECT更快

5

情况:我在我的SQLite数据库中有大约4000万行、3列未组织的数据表(~300MB)。我的数据示例如下:

|  filehash  |  filename  |  filesize  |
|------------|------------|------------|
|   hash111  |    fileA   |    100     |
|   hash222  |    fileB   |    250     |
|   hash333  |    fileC   |    380     |
|   hash111  |    fileD   |    250     |  #Hash collision with fileA
|   hash444  |    fileE   |    520     |
|     ...    |     ...    |    ...     |

问题: 单个SELECT语句需要花费3到5秒钟。我运行的应用程序需要快速响应,单个查询需要3到5秒钟太长了。
#calculates hash
md5hash = hasher(filename)
#I need all 3 columns so that I do not need to parse through the DB a second time
cursor.execute('SELECT * FROM hashtable WHERE filehash = ?', (md5hash,))
returned = cursor.fetchall()

问题:如何使SELECT语句运行更快(我知道这听起来很疯狂,但我希望速度低于0.5秒)?
附加信息1:我在一个RPi 3B上运行Python 2.7程序(1GB RAM,默认100MB SWAP)。我之所以问这个问题,主要是因为我担心它会因为“RAM不足”而崩溃。
参考资料:当我的应用程序运行时从数据库中读取数据,我们最多可以看到55MB的可用RAM,还有几百MB的缓存数据 - 我不确定这是SQLite缓存(SWAP没有被使用)。
附加信息2:我愿意使用其他数据库来存储表格(我正在考虑使用PyTables或ZODB作为替代方案 - 让我们说我有点绝望)。
附加信息3:由于哈希值会发生冲突,所以SELECT语句中没有唯一键,它将在列中查找匹配项。

1
展示数据库架构和查询。 - CL.
更新了我的问题@CL。 - Timothy Wong
1个回答

8

目前,数据库必须扫描整个表以查找所有匹配项。为了加快搜索速度,请使用索引:

CREATE INDEX my_little_hash_index ON hashtable(filehash);

3
谢谢,这正是我所需要的,天啊!现在每秒处理四个文件,而我现在需要每秒处理四千个文件。 - Timothy Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接