使SQLite更快地运行SELECT

黄(Timothy Wong)

情况:我的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(1GB RAM,默认100MB SWAP)上的Python 2.7程序上运行它。我之所以这样问,主要是因为恐怕它会因为“ RAM不足”而使RPi崩溃。

作为参考,在正常运行我的应用程序的情况下从数据库读取数据时,我们正在寻找最大55MB的可用内存,以及几百MB的缓存数据-我不确定这是否是SQLite缓存(未触及SWAP)。

附加信息2:我愿意使用其他数据库来存储表(我一直在寻找PyTables或ZODB作为替代品-只是说我有些绝望了)。

附加信息3:没有唯一键,因为该SELECT语句将在列中查找匹配项,这些匹配项只是哈希值,显然存在冲突。

CL。

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

CREATE INDEX my_little_hash_index ON hashtable(filehash);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章