2020年更新,大约11年前这个问题被发布,后来被关闭,阻止了更新的答案。

这里写的几乎都过时了。曾几何时,sqlite被限制在内存容量或2gb的存储空间(32位)或其他流行的数字…那是很久以前的事了。

官方限制列在这里。实际上,只要有可用的存储空间,sqlite就可能工作。它适用于比内存大的数据集,它最初是在内存很薄的时候创建的,从一开始就非常重要。

存储100gb的数据绝对没有问题。它可能可以很好地存储TB,但最终这是你需要质疑SQLite是否是最好的工具,你可能想要一个完整的数据库的功能(远程客户端,并发写入,只读副本,分片等…)


原:

我知道即使sqlite支持超大的数据库文件,sqlite也不能很好地处理它们(sqlite网站上曾经有一条评论说,如果你需要超过1GB的文件大小,你可能要考虑使用企业rdbms。再也找不到它了,可能与sqlite的旧版本有关)。

然而,出于我的目的,我想在考虑其他解决方案之前了解它到底有多糟糕。

我说的是从2GB开始的千兆字节范围的sqlite数据文件。 有人有这方面的经验吗?任何建议/想法吗?


当前回答

我创建了最大3.5GB的SQLite数据库,没有明显的性能问题。如果我没记错的话,我认为SQLite2可能有一些下限,但我不认为SQLite3有任何这样的问题。

根据SQLite Limits页面,每个数据库页面的最大大小是32K。数据库中的最大页面是1024^3。根据我的计算,最大大小是32tb。我认为在达到SQLite的限制之前,您将达到您的文件系统的限制!

其他回答

我认为关于sqlite缩放的主要抱怨是:

单进程写。 没有镜像。 没有复制。

我创建了最大3.5GB的SQLite数据库,没有明显的性能问题。如果我没记错的话,我认为SQLite2可能有一些下限,但我不认为SQLite3有任何这样的问题。

根据SQLite Limits页面,每个数据库页面的最大大小是32K。数据库中的最大页面是1024^3。根据我的计算,最大大小是32tb。我认为在达到SQLite的限制之前,您将达到您的文件系统的限制!

>花费48小时进行插入的主要原因是您的索引。它是令人难以置信的快:

1 -删除所有索引 2 -做所有的插入 3 -重新创建索引

除了通常的建议:

为批量插入删除索引。 在大型事务中批量插入/更新。 调优缓冲区缓存/禁用日志/w PRAGMAs。 使用64位机器(以便能够使用大量缓存™)。 [2014年7月添加]使用公共表表达式(CTE)而不是运行多个SQL查询!需要SQLite 3.8.3版。

我从SQLite3的经验中学到了以下几点:

For maximum insert speed, don't use schema with any column constraint. (Alter table later as needed You can't add constraints with ALTER TABLE). Optimize your schema to store what you need. Sometimes this means breaking down tables and/or even compressing/transforming your data before inserting to the database. A great example is to storing IP addresses as (long) integers. One table per db file - to minimize lock contention. (Use ATTACH DATABASE if you want to have a single connection object. SQLite can store different types of data in the same column (dynamic typing), use that to your advantage.

问题/欢迎发表评论。: -)

我有一个7GB的SQLite数据库。 使用内部连接执行特定查询需要2.6秒 为了加快速度,我尝试添加索引。根据我添加的索引,有时查询会下降到0.1秒,有时会上升到7秒。 我认为在我的情况下的问题是,如果一个列是高度重复的,然后添加索引降低性能:(