sqlite:获取所有行的最快方法(连续磁盘访问)

Chr*_*ris 4 sqlite system.data.sqlite

我想使用system.data.sqlite读取表中的所有行.由于我有一个非常大的表(> 450GB,行超过60亿),我想确保sqlite将使用连续的磁盘访问.您可能知道随机访问硬盘很慢.由于内存不足,我无法一次加载所有数据.所以最好的方法是如果sqlite读取几百MB(连续),那么我使用这些数据,sqlite读取下一个.

我怎么能确定sqlite会以这种方式进行磁盘访问而不是从硬盘上的一个位置跳转到另一个位置?

我知道的事情(我认为这些建议会出现):

  • 使用其他DBMS可能更好.但我希望/需要解决这个问题.
  • 我知道当我处理数据时,操作系统会将磁盘头定位在其他数据上.这没关系.只是连续阅读一些hundret MB.
  • 我不想/可以将数据库文件拆分成更小的部分

我找到了这篇文章,但它没有正确解决我的问题:
哪种方法可以检索SQLite中的所有项目?

小智 5

这就是聚集索引的用途.sqlite虽然不支持它们.

以下内容复制自:http://www.sqlite.org/cvstrac/wiki? p = PerformanceTuningWindows

四:聚集索引

SQLite不支持聚簇索引(简单地说,索引会强制数据库中的数据按照SAME顺序在物理上放置,因为索引需要它.)

这意味着如果您的索引是顺序INTEGER,则记录将按照INTEGER顺序在数据库中进行物理布局,1然后是2然后是3.

您不能创建聚簇索引,但可以按顺序对数据进行排序,以便很好地排序任何历史数据.当然,随着数据库的成熟,你会失去它,但它会有所帮助

其他人发布了这个,这是一个很好的例子,所以我会.如果你有一个WIBBLE表,你想要访问很多字段KEY,那么如果一切都井然有序就会很好.使用命令行工具,您可以通过执行以下操作来创建虚假集群:

create table wibble2 as select * from wibble;
delete from wibble;
insert into wibble select * from wibble2 order by key;
drop table wibble2;
Run Code Online (Sandbox Code Playgroud)

底线是您可以手动重新订购记录,但我想这只有在您不打算经常写入表时才适用.