我在SQLite数据库上有一个简单的查询(磁盘上为1.5GB)。看来我的循环很慢
for id, data in conn.execute("select ID, val in data order by ID"):
# do stuff
尽管ID列上有索引。 但是当我重新启动脚本时,在先前运行中读取的行以可接受的速度循环。它们是以某种方式缓存的吗?
我能做些什么来快速完成整个数据的循环?
编辑:
显然,orderby / index是问题所在。在使用和不使用order by
的情况下循环行之间的速度差异为2000x。
Pragma table_info(data)show
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)然后循环更快。我没有成功进行其他调整......
答案 0 :(得分:2)
您的操作系统缓存读取数据;如果您的硬盘很慢,初始读取将比后续运行慢。
您可以采取一些措施来加快速度:
运行VACUUM
以重建数据库文件;碎片和空白空间会影响数据的读取方式。
使用pragma cache_size = <page count>
调整页面缓存大小。默认值为2000页;如果您有内存,请尝试将其设置为更高的值。