SQLite 在 Python 中选择速度变化?
我在一个SQLite数据库上有个简单的查询(这个数据库在磁盘上占了1.5GB)。我发现我的循环速度很慢。
for id, data in conn.execute("select ID, val in data order by ID"):
# do stuff
尽管ID列上有索引,但当我重新启动脚本时,之前读取过的行在循环时速度就变得可以接受了。这是因为它们被缓存了吗?
有没有什么办法可以让对所有数据的循环变得更快呢?
编辑:显然,排序和索引是问题所在。循环带有order by
的行和不带的行之间的速度差异达到了2000倍。
通过Pragma table_info(data)可以查看
ID: cid=0 type=int notnull=0 dflt_value=null pk=0
val: cid=1 type=int notnull=0 dflt_value=null pk=0
我没有对任何东西做特别的调整。
使用VACUUM并没有提升性能。
我的索引是:
type=index, tbl_name=data rootpage=3 sql=create index myindex on data (ID)
解决了:创建一个覆盖索引(id, val)后,循环的速度快了很多。我在其他调整上没有成功...
1 个回答
2
你的操作系统会缓存读取的数据;如果你的硬盘比较慢,第一次读取数据会比后面几次慢。
有一些方法可以尝试加快速度:
运行一个
VACUUM
命令来重建数据库文件;因为数据碎片和空闲空间会影响数据的读取方式。调整页面缓存的大小,可以使用
pragma cache_size = <页数>
。默认是2000页;如果你的内存足够,可以尝试把这个值调高。