关于数据库:如何决定是否需要从sqlite过渡

How to decide whether I need to transition away from sqlite

我正在使用django创建一个网站。它刚刚完成,但还没有上线。我正在尝试确定SQLite是否足够好用于该站点,或者现在是否值得在开始时使用PostgreSQL,而不是需要稍后转换到它的风险。 (在这篇文章中,我提到了PostgreSQL,因为那是我的另一个竞争者。我确信可以用MySQL或Oracle进行类似的分析。)

我可以使用人们的一些意见,了解他们如何决定使用django项目的数据库。

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

  • 根据我的经验,SQLite非常简单。我不需要担心为它安装一些其他依赖项,它几乎只是开箱即用django。

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

这是我不知道的:

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

  • 从性能的角度来看,PostgreSQL在各方面都比SQLite更好吗?或者SQLite比PostgreSQL有一些优势?

  • 除了性能之外,使用PostgreSQL是否提供了超过SQLite的其他部署优势?

基本上我认为SQLite对我的小网站来说已经足够了。它变得非常受欢迎的几率是多少?可能不那么好。 SQLite现在正在为我工??作,不需要我的结果。但是,我担心从一开始就使用PostgreSQL会很容易,而且从现在起一年内我就不会进行转换。我被撕裂了 - 如果我去PostgreSQL,也许这对我没有任何好处是不必要的麻烦。

有没有人有决定SQLite和其他东西的一般指导方针?

谢谢!


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

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

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

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

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

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

简而言之:当您的网站停止成为玩具时,您应该已经切换。您应该在第一次严重负载峰值之前切换一段时间,以消除任何明显的问题。

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