使SQLite更快地运行SELECT

时间:2018-02-21 09:38:20

标签: python-2.7 performance sqlite raspberry-pi3

情况:我的SQLite DB中的表中有大约4千万行,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)。我问的主要是因为我担心它会导致RPi崩溃,因为没有足够的RAM'。

作为参考,当我正在运行我的应用程序时正常读取数据库时,我们正在查看最多55MB的RAM,以及几百MB的缓存数据 - 我不确定这是否是SQLite缓存(SWAP尚未触摸)。

附加信息2:我愿意使用其他数据库存储表格(我正在查看PyTables或ZODB作为替代品 - 让我们说我有点绝望)。

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

1 个答案:

答案 0 :(得分:2)

目前,数据库必须扫描整个表以查找所有匹配项。要speed up searches,请使用索引:

CREATE INDEX my_little_hash_index ON hashtable(filehash);