【问题标题】:How to decide whether I need to transition away from sqlite [closed]如何决定我是否需要从 sqlite 过渡 [关闭]
【发布时间】:2013-12-28 05:31:09
【问题描述】:

我正在使用 django 创建一个网站。它即将完成,但尚未上线。我正在尝试确定 SQLite 是否适合该站点,或者是否值得现在一开始就使用 PostgreSQL,而不是冒着以后需要过渡到它的风险。 (在这篇文章中,我提到 PostgreSQL 是因为它是我的另一个竞争者。我相信 MySQL 或 Oracle 也可以进行类似的分析。)

我可以参考人们关于他们如何决定在他们的 django 项目中使用什么数据库的意见。

以下是我目前对此的理解:

  • 根据我的经验,SQLite 超级简单。我不需要担心为它安装一些其他依赖项,它几乎可以与 django 一起使用。

  • 根据我的在线研究,SQLite 似乎能够在成为性能瓶颈之前处理相当多的负载。

以下是我不知道的:

  • 我从 SQLite 过渡到 PostgreSQL 会涉及什么?同样,我目前处于仅开发阶段,因此不需要从 SQLite 转换任何数据库数据。是否只是在服务器上安装 PostgreSQL,然后调整 settings.py 文件以使用它?我对此表示怀疑,但是我的任何 django 代码都需要更改吗? (我没有任何原始 SQL 查询 - 我的数据库访问仅限于 django 的模型 API。)

  • 从性能的角度来看,PostgreSQL 在各个方面都比 SQLite 更好吗?还是 SQLite 比 PostgreSQL 有某些优势?

  • 抛开性能不谈,与 SQLite 相比,使用 PostgreSQL 是否提供其他部署优势?

基本上我认为 SQLite 对于我的小网站来说已经足够好了。它真正流行起来的几率有多大?可能没那么厉害。 SQLite 现在正在为我工​​作,并且不需要我进行任何更改。但是,我担心也许从一开始就使用 PostgreSQL 会很容易,而且我会在一年后因为没有进行过渡而自责。不过我很伤心——如果我去 PostgreSQL,也许这对我来说是不必要的麻烦,没有任何好处。

有没有人有在 SQLite 和其他东西之间做出决定的一般准则?

谢谢!

【问题讨论】:

  • 关于暂停:我很欣赏这种节制,我不希望提出基于意见的问题。我想我已尽我所能通过概述基于事实的信息可能有用的三个地方,将讨论的范围限制在特定的、客观的原因上,即人们想要从 SQLite 转换(或不转换)的原因。与此相对应,9000 的回答提供了对我有帮助的具体、客观的陈述。无论如何,我愿意接受有关如何修改问题以使其更有帮助的建议。谢谢!

标签: database django sqlite


【解决方案1】:

这里有几点需要考虑。

SQLite 不允许并发写入。如果发出insertupdate,则the entire database is locked,甚至在实际更新的短时间内不允许读取。如果您的应用程序将有许多用户更新其状态(发布 cmets、添加喜欢等),这将成为瓶颈。即使用户数量相对较少,也会不时出现令人不快的减速。

SQLite 不允许多个进程有效地访问数据库。即使你有多个 CPU,也只能有一个写入进程,即使这样,锁定机制也是非常低效的。为确保数据完整性,您需要跳过许多环节,而且每次更新都会非常缓慢。 Postgres 可以优化地重新排序锁,在行级别锁定表,甚至在不锁定的情况下更新,因此它将在 SQLite 性能方面运行循环,除非您的数据库严格是只读的。

SQLite 不允许数据分区,甚至不允许将不同的表放到不同的表空间;一切都存在于一个文件中。如果您有一个经常被触及的“热”表(例如会话、授权、统计信息),则您无法调整其参数,将其放在 SSD 上等。但是,如果关系完整性,您可以为此使用单独的数据库并不重要。

SQLite 没有复制或故障转移功能。如果你的应用程序的停机时间会花费你的钱,你最好有一个热备份数据库服务器,准备好在主服务器出现故障时接管。使用 Postgres,这是相对轻松的;几乎没有使用 SQLite。

SQLite 没有在线备份和时间点恢复功能。如果您从用户那里收到的数据会让您花钱(例如商家订单或 SLA 下的用户数据),您最好定期备份您的数据,甚至是连续备份。 Postgres,当然是can do this; SQLite 不能。

简而言之:当您的网站不再是玩具时,您应该已经切换了。您应该在第一次出现严重的负载峰值之前切换一段时间,以解决任何明显的问题。

幸运的是,Django ORM 使 Python 端的切换非常变得容易:您主要更改 settings.py 中的连接字符串。在实际的数据库方面,您将不得不做更多的事情:分析您最重要的查询,调整某些列类型和索引等。除非您自己知道如何烹饪 Postgres,否则请寻求知道的人的帮助;数据库有许多不明显的微妙之处,它们会显着影响性能。部署 Postgres 肯定比 SQLite 更棘手(虽然并不难);结果是方式在负载下的操作/维护方面更具功能性。

【讨论】:

  • 真的很棒。此外,SQLite 不能很好地处理模式更改。来自文档:“无法重命名列、删除列或在表中添加或删除约束”
  • @sk1p:好点。通常,您不希望在针对大型重要表发出的一些无害的alter table 语句的整个持续时间内使生产系统脱机。
  • 很棒的答案 9000!我很难找到 PostgreSQL 相对于 SQLite 的特定优势。我也很欣赏过渡到 PostgreSQL 时的期望。谢谢!
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 2014-02-26
  • 2018-07-15
  • 2021-07-24
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多