情况:我在我的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
语句中没有唯一键,它将在列中查找匹配项。