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

时间:2013-12-28 05:31:09

标签: database django 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和其他东西之间做出决定的一般指导原则?

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

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