SQLite作为低stream量网站的生产数据库?
我正在考虑使用SQLite作为一个网站的生产数据库,可能会收到20个同时在线用户,但有可能是一个高峰,可能是多个倍数(因为该网站将在开放的互联网上访问,总是有有人会在某个地方张贴链接,可能会立即将许多人带到网站)。
SQLite是否有可能?
我知道这不是一个理想的生产场景。 我只是问,这是否是在一个现实的可能性领域。
SQLite不支持任何types的并发,所以你可能在生产网站上运行时遇到问题。 如果你正在寻找一个“更轻”的数据库,也许考虑尝试一个像CouchDB这样的当代对象文档存储。
通过一切手段继续开发反对SQLlite,你可能很好,最初使用它。 如果你发现你的应用程序拥有更多的用户,那么你会想转换到postgres或mysql。
SQLlite的作者在网站上解决了这个问题 :
对于中低stream量网站(也就是所有网站的99.9%)来说,SQLite通常会起到很好的作用。 SQLite可以处理的networkingstream量的大小,当然取决于网站使用数据库的程度。 一般来说,任何每天点击次数less于100K的站点应该可以很好的与SQLite一起工作。 10万点击/天的数字是一个保守的估计,不是一个硬性上限。 SQLite已被certificate可以处理10倍的stream量。
SQLite通常会正常工作,因为数据库后端到一个网站。 但是如果你的网站如此繁忙,以至于你想把数据库组件拆分到一个单独的机器上,那么你绝对应该考虑使用企业级的客户机/服务器数据库引擎而不是SQLite。
所以我认为它的长短是,去做吧,如果它不适合你,那么过渡到企业级数据库是相当微不足道的。 不过要注意自己的模式,并考虑到增长和效率来devise数据库。
这里有一个线索,提供了更多关于使用SQLite生成Web应用程序的独立评论。 听起来好像已经使用了一些混合的结果。
编辑(2014) :
由于这个答案已经发布,SQLite现在具有multithreading模式和预 写日志logging模式 ,这可能会影响您对中低stream量站点的适用性的评估。
Charles Leifer写了一篇关于SQLite的WAL(预写日志)function的博客文章 ,以及一些关于适当的用例的深思熟虑的意见。
从SQLite 网站的小部分摘录了这一切。
数据是通过networking与应用程序分离的吗? →select客户端/服务器
许多并发作家? →select客户端/服务器
大数据 ? →select客户端/服务器
否则→selectSQLite !
SQLite“正常工作”。
我们经常使用SQLite作为内部数据库; 员工目录,我们的事件日历和其他Intranet服务都运行在轻量级数据库上。 以mySQL这样的“真实”数据库的规模来运行这些应用程序将是一个重大的矫枉过正。 当考虑到他们正在单个中端计算机上运行其他4台虚拟机时,情况尤其如此。
有一次,我们有一个面向外部的网站在sqlite数据库上运行了几个月,只需要一次重启。 很显然,这是非常低的stream量,但它所做的很好。
我想这主要取决于你的读写比例。 如果它主要是从数据库中读取,你可能会没事的。 SQLite中的多用户写入可能是一个问题,因为它如何locking数据库。
人们谈论的是并发问题,但是sqlite有一种caching传入请求的方法,让他们等待一段时间。 它不会立即超时。
我已经读了关于默认超时设置开始零的事情,这意味着它立即超时,这是无稽之谈。 也许人们没有调整这个设置?
我们在一个完全没有写入的环境中遇到了类似的select,我们select使用SQLite。
看到我的博客文章的主题:
那么,这个解决scheme在理论上可能的主要假设是我们的SQLite数据库是完全只读的。 我们的服务器代码不应该改变它。 这将解决任何locking问题,因为没有读锁。 我们可以在互联网上找不到任何人说在没有写入的情况下,SQLite的高吞吐量读取有问题 – 这是可能的!
取决于网站的使用情况。 如果大部分时间只是读取数据,那么几乎可以使用任何数据库的数据,并在应用程序中caching数据以获得良好的性能。
如果是我 – 我只是使用MySQL。 我们对这些东西太珍贵了。 我的MySQL运行在NetGear ReadyNAS上,内存非常有限(256MB RAM,我认为),而32MHz(你读的是正确的)处理器。 没关系。 我已经在一台低端的Windows PC上运行,大约有200 MHz的处理器和小的RAM。 这两种情况下提供网页。 不可否认20位用户同时使用
但是,原则上,如果你的硬件是合理的,数据库内容不是很大,那么像MySQL这样的东西是免费的,易于使用和安装的,速度很快,似乎可以很好地扩展。 我会为此付出我的宝贵时间。
我使用它在一个非常低的交通networking服务器(这是一个基因组数据库),我没有任何问题。 但是只有SELECT语句, 没有写入涉及的数据库 。
添加一个已经很明智的答案:因为在这种情况下你正在使用一个无服务器的解决scheme,所以你可以告别复制,或者你的数据库的任何水平缩放,以及其他高级选项。 如果你有多个用户更新相同的信息块,这也不是最好的select。 如果将来要分割数据库,则必须迁移数据并移至其他位置。 另外,如果你有一个负载平衡器和涉及多个系统,如果使用sqlite,将很难保持数据中心性。 这些只是不被推荐的一些原因。 它非常适合小型项目,也适合开发。
看起来像排队,你也可以避免与SQLite的许多并发写入问题。 不是直接写入sqlite数据库,而是写入一个队列,然后依次以先入先出的方式写入sqlite数据库。 不知道如果你的应用程序到达你需要的地方,如果这是值得写的,或只是移动到客户端/服务器数据库…但一个想法。