如何决定是否需要从 sqlite 过渡

fir*_*ush 2 database sqlite django

我正在使用 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 和其他东西之间做出决定的一般准则吗?

谢谢!

900*_*000 5

以下是需要考虑的一些事项。

SQLite 不允许并发写入。如果发出aninsert或 an ,整个数据库将被锁定,甚至在实际更新的短时间内不允许读取。如果您的应用程序将有许多用户更新其状态(发表评论、添加喜欢等),这将成为瓶颈。即使用户数量相对较少,令人不快的速度也会时不时地发生。update

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

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

SQLite 没有复制或故障转移功能。如果您的应用程序的停机时间会让您损失金钱,那么您最好拥有一个热备份数据库服务器,以便在主服务器出现故障时可以接管。对于 Postgres,这相对来说是轻松的;对于 SQLite,几乎没有。

SQLite不具备在线备份和时间点恢复功能。如果您从用户处收到的数据需要付费(例如,SLA 下的商家订单或用户数据),那么您最好定期甚至连续备份数据。当然,Postgres可以做到这一点;SQLite 不能。

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

幸运的是,Django ORM 使 Python 端的切换变得非常容易:您主要更改settings.py. 在实际的数据库方面,您需要做更多的事情:分析最重要的查询、调整某些列类型和索引等。除非您知道如何自己编写 Postgres,否则请寻求了解的人的帮助;数据库有许多不明显的微妙之处,但它们会显着影响性能。部署 Postgres 肯定比 SQLite 更棘手(尽管并不难);当涉及到负载下的操作/维护时,其结果是更加实用。