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

标签 database django sqlite

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

8年前关闭。




Improve this question




我正在使用 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发出,the entire database is locked ,甚至在实际更新的短时间内不允许阅读。如果您的应用程序将有许多用户更新其状态(发表评论、添加喜欢等),这将成为一个瓶颈。即使用户数量相对较少,也会不时出现令人不快的减速。

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

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

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

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

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

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

    关于database - 如何决定是否需要从 sqlite 过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811373/

    相关文章:

    python - Django LazyUser 代码如何工作?

    database - 没有模式时如何存储数据?

    MySQL:如何根据另一个表中的 id 从一个表中获取一条信息

    spring - 如何在 JPA 中创建日期规范以查找更大/更少等?

    database - 寻找相关或联动的股票

    python - 如何从存储库中删除带有 Django 项目的 virtualenv 并添加 requirements.txt 文件?

    python - 在 Django 序列化程序中,从上下文(或请求数据)中获取默认字段值

    android - 如何删除某些字段中具有重复数据的连续行(在 SQLite 中)?

    python - 将字典插入 sqlite3 数据库 - python

    mysql - 将SQLite请求中的strftime转换为MySQL