我最近阅读了关于SQLite vs MySQL的这个问题,答案指出SQLite不能很好地扩展,官方网站sort-of confirms this也是如此。
SQLite的可扩展性如何?它的最大限制是什么?
答案 0 :(得分:421)
昨天我发布了一个小型网站 * ,以跟踪您为所有访问者使用共享SQLite数据库的代表。不幸的是,即使它放在我的主机上的适度负载,它运行得相当慢。这是因为每次有人查看页面时都会锁定整个数据库,因为它包含更新/插入。我很快就切换到MySQL,虽然我没有太多时间来测试它,但它似乎比SQLite更具可扩展性。我只记得缓慢的页面加载,偶尔在尝试从sqlite中的shell执行查询时遇到数据库锁定错误。也就是说,我从SQLite运行另一个网站就好了。不同之处在于站点是静态的(即我是唯一可以更改数据库的站点),因此对于并发读取它可以正常工作。故事的道德:只使用SQLite用于很少发生数据库更新的网站(少于每个加载的页面)。
编辑:我刚刚意识到我可能对SQLite不公平 - 当我从网页上提供SQLite数据库时,我没有索引SQLite数据库中的任何列。这部分导致了我所经历的放缓。但是,观察数据库锁定站 - 如果你有特别繁琐的更新,SQLite性能将无法匹配MySQL或Postgres。
另一个编辑:自从我差不多3个月前发布这篇文章以来,我有机会仔细研究SQLite的可扩展性,并且通过一些技巧可以实现可扩展性。正如我在第一次编辑中提到的,数据库索引大大减少了查询时间,但这更像是对数据库的一般观察,而不是SQLite。但是,您可以使用另一个技巧来加速SQLite:transactions。每当您必须执行多个数据库写入时,请将它们放在事务中。每次发出写入查询时,写入只会在事务完成时发生一次,而不是写入(并锁定)文件。
我在第一段中发布的网站已经切换回SQLite,一旦我在几个地方调整了代码,它运行得非常顺利。
*网站不再可用
答案 1 :(得分:56)
Sqlite在单用户方面是可扩展的,我有几千兆字节的数据库,表现非常好,我没有遇到太多问题。
但它是单用户,所以它取决于你所说的缩放比例。
回应评论。请注意,没有什么可以阻止在多用户环境中使用Sqlite数据库,但每个事务(实际上,每个修改数据库的SQL语句)都会锁定文件,这将阻止其他用户完全访问数据库 。
因此,如果您对数据库进行了大量修改,那么您实际上很快就会遇到扩展问题。另一方面,如果与写访问相比,您拥有大量的读取访问权限,则可能不会那么糟糕。
但是Sqlite当然会在多用户环境中功能,但它不会执行。
答案 2 :(得分:26)
SQLite驱动sqlite.org网站和其他拥有大量流量的网站。他们建议,如果每天有less than 100k次点击,SQLite应该可以正常工作。这是在他们发布“Writeahead Logging”功能之前编写的。
如果您想使用SQLite加快速度,请执行以下操作:
您可能需要查看YouTube上名为“Improve SQLite Performance With Writeahead Logging”的视频,其中显示了如何使用预写日志记录并演示了写入速度提高了5倍。
答案 3 :(得分:24)
Sqlite是桌面或进程内数据库。 SQL Server,MySQL,Oracle及其兄弟是服务器。
对于需要支持对数据存储的并发写访问的任何应用程序来说,桌面数据库本身并不是一个好的选择。这包括在某种程度上创建的大多数网站。如果您甚至必须登录任何内容,您可能需要对数据库的写访问权。
答案 4 :(得分:23)
您是否阅读过此SQLite文档 - http://www.sqlite.org/whentouse.html?
SQLite通常会很好用 低到中的数据库引擎 交通网站(也就是说, 99.9%的网站)。 SQLite可以处理的Web流量 当然,取决于多大程度 网站使用其数据库。通常 说,任何减少的网站 超过100K点击/天应该工作正常 与SQLite。 100K点击/天的数字 是一个保守估计,而不是一个难 上限。 SQLite一直都是 证明可以使用10次 那个流量。
答案 5 :(得分:8)
SQLite可伸缩性将高度依赖于所使用的数据及其格式。我对超长桌子(GPS记录,每秒一个记录)有一些艰难的经历。经验表明,SQLite会逐步减速,部分原因是持续重新平衡不断增长的持有索引的二叉树(以及带时间戳的索引,你只是知道树将会重新平衡很多,但它对你的搜索至关重要)。所以最终大约1GB(非常棒球,我知道),在我的情况下,查询变得迟钝。你的里程会有所不同。
有一点要记住,尽管吹牛,但SQLite并不是为了数据仓库。 SQLite有各种用途not recommended。 SQLite背后的好人自己说:
另一种看待SQLite的方法是:SQLite不是为了取代Oracle而设计的。它旨在取代fopen()。
这导致了主要论点(不是定量的,抱歉,而是定性的),SQLite并非适用于所有用途,而MySQL可以涵盖许多不同的用途,即使不理想。例如,您可以让MySQL存储Firefox cookie(而不是SQLite),但您需要始终运行该服务。另一方面,您可以在SQLite上运行一个事务性网站(与许多人一样)而不是MySQL,但期望大量的停机时间。
答案 6 :(得分:3)
我认为(在数字1中)服务于客户端的服务器的网络服务器出现在后端,只有一个与数据库的连接,不是吗?
因此数据库中没有并发访问,因此我们可以说数据库正在“单用户模式”下工作。在这种情况下进行多用户访问是没有意义的,所以SQLite和任何其他基于服务器的数据库一样。
答案 7 :(得分:2)
这样想。每当有人使用它时,SQL Lite都会被锁定(SQLite不会锁定读取)。因此,如果您提供网页或具有多个并发用户的应用程序,则只能使用SQLLite一次使用您的应用程序。所以正确存在扩展问题。如果它是一个单独的应用程序说一个音乐库,你可以拥有数百个标题,评级,信息,使用,播放,播放时间,那么SQL Lite将精确地扩展,即使不是数百万条记录也能保存数千个(硬盘意愿)
另一方面,MySQL适用于服务器应用程序,其中人们将同时使用它。它没有锁定,而且尺寸非常大。因此,对于你的音乐库,MySql会因为只有一个人会看到它而被杀死,除非这是一个共享音乐库,其中有数千个添加或更新它。那么MYSQL将是一个可以使用的。因此理论上,MySQL比Sqllite更好地扩展,因为它可以处理多个用户,但对单个用户应用程序来说是过度杀伤。
答案 8 :(得分:1)
SQLite的网站(您引用的部分)表明它可以用于各种多用户情况。
我会说它可以处理很多。根据我的经验,它一直非常快。当然,您需要为表编制索引,并在对其进行编码时,您需要确保使用parameritized查询等。基本上你可以用任何数据库来提高性能。
答案 9 :(得分:0)
值得查看REAL SQL Server,这是一个基于SQLite构建的数据库服务器。