187

我最近阅读了这个关于SQLite vs MySQL的问题,答案指出 SQLite 不能很好地扩展,但是官方网站也证实了这一点

SQLite 的可扩展性如何,它的最高限制是什么?

4

10 回答 10

438

昨天我发布了一个小网站*跟踪为所有访问者使用共享 SQLite 数据库的代表。不幸的是,即使它给我的主机带来了适度的负载,它的运行速度也很慢。这是因为每次有人查看该页面时整个数据库都被锁定,因为它包含更新/插入。我很快切换到 MySQL,虽然我没有太多时间来测试它,但它似乎比 SQLite 更具可扩展性。我只记得在 sqlite 中尝试从 shell 执行查询时,页面加载速度很慢,偶尔会出现数据库锁定错误。也就是说,我正在从 SQLite 运行另一个站点就好了。不同之处在于该站点是静态的(即我是唯一可以更改数据库的站点),因此对于并发读取来说它工作得很好。故事的道德启示:

编辑:我刚刚意识到我可能对 SQLite 不公平——当我从网页提供 SQLite 数据库时,我没有索引 SQLite 数据库中的任何列。这部分导致了我正在经历的放缓。然而,数据库锁定的观察结果——如果你有特别繁重的更新,SQLite 的性能将无法与 MySQL 或 Postgres 相提并论。

另一个编辑:自从我将近 3 个月前发布了这篇文章以来,我有机会仔细检查 SQLite 的可伸缩性,并且通过一些技巧,它可以具有相当大的可伸缩性。正如我在第一次编辑中提到的,数据库索引大大减少了查询时间,但这更多的是对数据库的一般观察,而不是对 SQLite 的观察。但是,您可以使用另一个技巧来加速 SQLite:事务。每当您必须执行多个数据库写入时,请将它们放在事务中。而不是每次发出写入查询时都写入(并锁定)文件,写入只会在事务完成时发生一次。

我在第一段中提到我发​​布的网站已经切换回 SQLite,一旦我在几个地方调整了我的代码,它就运行得非常顺利。

* 该网站不再可用

于 2008-09-15T11:42:11.557 回答
62

Sqlite 在单用户方面是可扩展的,我有性能非常好的数 GB 数据库,而且我没有遇到太多问题。

但它单用户的,所以这取决于你在谈论什么样的扩展。

回应评论。请注意,没有什么可以阻止在多用户环境中使用 Sqlite 数据库,但是每个事务(实际上是修改数据库的每个 SQL 语句)都会对文件进行锁定,这将阻止其他用户访问数据库所有.

因此,如果您对数据库进行了大量修改,您基本上会很快遇到扩展问题。另一方面,如果与写访问相比,你有很多读访问,那可能还不错。

但是 Sqlite 当然会在多用户环境中运行,但它不会表现良好。

于 2008-09-15T10:38:28.623 回答
32

SQLite 驱动 sqlite.org 网站和其他拥有大量流量的网站。他们建议,如果您每天的点击次数少于 100k ,SQLite 应该可以正常工作。这是在他们提供“Writeahead Logging”功能之前编写的。

如果您想使用 SQLite 加快速度,请执行以下操作:

  • 升级到 SQLite 3.7.x
  • 启用预写日志记录
  • 运行以下 pragma:“PRAGMA cache_size = Number-of-pages;” 默认大小(页数)为 2000 页,但如果提高该数字,则会增加直接耗尽内存的数据量。

您可能想看一下我在 YouTube 上名为“使用 Writeahead Logging 提高 SQLite 性能”的视频,该视频展示了如何使用 write-ahead logging 并演示了 5 倍的写入速度改进。

于 2010-12-15T15:12:07.450 回答
26

Sqlite 是一个桌面进程内数据库。SQL Server、MySQL、Oracle 和它们的兄弟都是服务器

对于需要支持对数据存储的并发写入访问的任何应用程序,桌面数据库本质上不是一个好的选择。这在某种程度上包括大多数曾经创建的网站。如果您甚至必须登录进行任何操作,您可能需要对数据库的写访问权。

于 2008-09-10T18:51:32.690 回答
23

你读过这个 SQLite 文档 - http://www.sqlite.org/whentouse.html吗?

SQLite 通常可以很好地作为中低流量网站(也就是说,所有网站的 99.9%)的数据库引擎。当然,SQLite 可以处理的网络流量取决于网站使用其数据库的程度。一般来说,任何每天点击量少于 100K 的网站都可以使用 SQLite。10 万次点击/天的数字是保守估计,而不是硬性上限。SQLite 已被证明可以处理 10 倍的流量。

于 2009-05-05T22:27:36.937 回答
10

SQLite 可扩展性将高度依赖于所使用的数据及其格式。我在超长表(GPS 记录,每秒一条记录)方面有过一些艰难的经历。经验表明,SQLite 会分阶段减速,部分原因是不断重新平衡不断增长的持有索引的二叉树(并且使用带时间戳的索引,您只知道树会得到很多重新平衡,但这对您至关重要)搜索)。所以最终大约 1GB(我知道,非常接近),在我的情况下查询变得迟缓。您的里程会有所不同。

有一件事要记住,尽管吹牛,SQLite 不是为数据仓库而生的。SQLite有各种不推荐的用途。SQLite 背后的优秀人士自己说:

另一种看待 SQLite 的方式是:SQLite 并非旨在取代 Oracle。它旨在取代 fopen()。

这导致了主要论点(不是定量的,抱歉,而是定性的),SQLite 并不适用于所有用途,而 MySQL 可以涵盖许多不同的用途,即使不是很理想。例如,您可以让 MySQL 存储 Firefox cookie(而不是 SQLite),但您需要始终运行该服务。另一方面,您可以在 SQLite(正如许多人所做的那样)而不是 MySQL 上运行事务性网站,但预计会有很多停机时间。

于 2010-08-24T05:02:06.830 回答
3

这样想吧。每次有人使用 SQL Lite 时都会被锁定(SQLite 不会锁定读取)。因此,如果您提供一个网页或一个有多个并发用户的应用程序,那么一次只有一个用户可以通过 SQLLite 使用您的应用程序。所以就存在缩放问题。如果它是一个人的应用程序,比如一个音乐库,其中您拥有数百个标题、评级、信息、使用、播放、播放时间,那么 SQL Lite 将完美地扩展保存数千甚至数百万条记录(硬盘愿意)

另一方面,MySQL 非常适用于人们同时使用它的服务器应用程序。它不锁定,而且尺寸相当大。因此,对于您的音乐库,MySql 将被过度杀死,因为只有一个人会看到它,除非这是一个共享音乐库,成千上万的人添加或更新它。然后 MYSQL 将是使用的。

所以理论上 MySQL 的扩展性比 Sqllite 更好,因为它可以处理多个用户,但对于单个用户的应用程序来说太过分了。

于 2008-09-15T20:41:07.830 回答
3

我认为一个(数量为 1)为数百个客户端提供服务的网络服务器出现在后端,与数据库的单个连接,不是吗?

因此数据库中没有并发访问,因此我们可以说数据库正在“单用户模式”下工作。在这种情况下讨论多用户访问是没有意义的,因此 SQLite 与任何其他基于服务器的数据库一样工作。

于 2009-10-31T11:33:32.470 回答
1

SQLite 的网站(您引用的部分)表明它可以用于各种多用户情况。

我会说它可以处理很多。根据我的经验,它一直非常快。当然,您需要索引您的表,并且在针对它进行编码时,您需要确保使用参数化查询等。基本上与您对任何数据库执行的操作相同,以提高性能。

于 2009-03-28T14:51:06.930 回答
-1

可能值得一试REAL SQL Server,它是基于 SQLite 构建的数据库服务器。

于 2009-01-11T22:19:17.263 回答