python-2.7 - 使 SQLite 更快地运行 SELECT

标签 python-2.7 performance sqlite raspberry-pi3

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

|  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 程序上运行它。我问主要是因为我担心它会因为“内存不足”而导致 RPi 崩溃。

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

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

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

最佳答案

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

CREATE INDEX my_little_hash_index ON hashtable(filehash);

关于python-2.7 - 使 SQLite 更快地运行 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48902515/

相关文章:

python - Groupby 求和并计算 python 中的多列

python-2.7 - Python读取unicode文件名

Python writelines() 和 write() 巨大的时间差

c++ - 为什么两个连续的收集指令比等效的基本操作执行得更差?

windows - 通用 Windows 平台上的 Mono.data.sqlite

具有其他含义的 Python 运算符(如打印 V 形)

Python C 头文件

javascript - 为什么 "use strict"在此示例中将性能提高 10 倍?

sql - SQLite选择多组行

mysql - 一个大的 MySQL 数据库还是一千个小的 SQLite 数据库?