MySQL vs PostgreSQL? 我应该select哪个Django项目?

我的Django项目将由一个拥有数十万个条目的大型数据库支持,并且需要支持search(我可能最终会使用djangosearch或类似的项目)。

哪个数据库后端最适合我的项目,为什么? 你能推荐任何好的资源进一步阅读?

作为最近从MySQL切换到PostgreSQL的项目,我不会后悔。

从Django的angular度来看,主要的区别是在Postgresql中进行更严格的约束检查,这是一件好事,而且手动模式更改(又名迁移)更麻烦一些。

大概有6个左右的Django数据库迁移应用程序,至less有一个不支持Postgresql。 我不认为这是一个缺点,虽然因为你可以使用其中一个或手动(这是我更喜欢atm)。

全文search可能会更好地支持MySQL。 MySQL在Django内部支持内置的全文search,但是非常没用(没有词干,词组search等等)。 我已经使用django-sphinx作为在MySQL中进行全文search的更好select。

全文search内置Postgresql 8.3(早期版本需要TSearch模块)。 这里有一个很好的教学博客文章: 用PostgreSQL和tsearch2在Django中进行全文search

对于Django的创造者来说,值得推荐的是PostgreSQL。

如果你没有绑定到任何遗留系统,并有自由select数据库后端,我们build议PostgreSQL,成本,function,速度和稳定性之间的良好平衡。 ( Django权威指南 ,第15页)

拥有数十万条大数据库,

这不是大数据库,它是非常小的一个。

我会selectPostgreSQL,因为它有更多的function。 最重要的是这种情况:在PostgreSQL中,你可以使用Python作为过程语言。

跟你更熟悉的那个去。 MySQL vs PostgreSQL是一场无休止的战争。 他们都是优秀的数据库引擎,并且都被大型网站所使用。 在实践中真的没有关系。

即使Postgresql看起来更好,我发现Django有一些性能问题:

Postgresql被用来处理“长连接”(连接池,持久连接等)

MySQL是用来处理“短连接”(连接,做你的查询,断开连接, 有很多开放连接的一些性能问题 )

问题是,Django不支持连接池或持久连接,它必须连接/断开每个视图调用数据库。

它可以和Postgresql一起工作,但连接到Postgresql比连接到MySQL数据库花费更多(在Postgresql上,每个连接都有它自己的进程,比在MySQL中popup一个新线程慢得多)。

然后你可以得到一些像查询caching这样的function,在某些情况下可以非常有用。 (但是你失去了PostgreSQL的超级文本search)

所有的答案都将有趣的信息带到桌子上,但有些已经过时了,所以这里是我的一粒盐。

从1.7开始, 迁移现在是Django的一个整体function。 所以他们logging了Django开发者可能想要事先知道的主要差异。

后端支持

在Django附带的所有后端以及任何第三方后端(如果已经编程支持架构变更(通过SchemaEditor类完成的))上支持迁移 。

但是,有些数据库在架构迁移方面比其他数据库更有能力; 一些注意事项如下所述。

PostgreSQL的

在模式支持方面,PostgreSQL是所有数据库中最有能力的; 唯一需要注意的是,添加具有默认值的列将导致表格的完全重写,时间与其大小成正比。

出于这个原因,build议您始终使用null = True创build新列,这样它们将立即添加。

MySQL的

MySQL缺less对模式变更操作的支持,这意味着如果迁移失败,您将不得不手动取消更改以重试(不可能回滚到更早的点)。

此外,MySQL将为几乎每个模式操作完全重写表,并且通常需要一个与表中的行数成比例的时间来添加或删除列。 在速度较慢的硬件上,这可能比每百万行一分钟更糟糕 – 在仅有几百万行的表中添加几列可能会使您的站点locking超过十分钟。

最后,MySQL对列,表和索引的名称长度也有相当小的限制,并且索引涵盖的所有列的组合大小也是有限制的。 这意味着其他后端可能的索引将无法在MySQL下创build。

SQLite的

SQLite内置模式更改支持很less,所以Django试图通过以下方式来模拟它:

  • 用新模式创build一个新表
  • 跨数据复制
  • 丢下旧桌子
  • 重命名新表以匹配原始名称

这个过程通常效果不错,但速度可能会很慢,偶尔也会有问题。 不build议您在生产环境中运行和迁移SQLite,除非您非常清楚风险及其限制; Django附带的支持旨在允许开发人员在其本地机器上使用SQLite来开发不太复杂的Django项目,而不需要完整的数据库。

当django-south迁移失败时,开发者鼓励你不要使用MySQL:

! The South developers regret this has happened, and would ! like to gently persuade you to consider a slightly ! easier-to-deal-with DBMS (one that supports DDL transactions) 

要添加到以前的答案:

  • “全文search可能会更好地支持MySQL”

MySQL中的FULLTEXT索引是一个笑话。

  • 它只适用于MyISAM表,所以你失去了ACID,事务,约束,关系,持久性,并发性等。
  • 插入/更新/删除到一个大的文本列(如论坛post)将重build索引的很大一部分。 如果它不适合myisam_key_buffer,则会发生较大的IO。 我已经看到一个单一的论坛post插入触发100MB或更多的IO …同时post表是exclusielylocking!
  • 我做了一些基准testing(3年前,可能是陈旧的…),这表明在大型数据集上,基本上postgres全文比mysql快10到100倍,而Xapian比postgres快10到100倍(但没有集成)。

没有提到的其他原因是非常聪明的查询优化器,大量的连接types(合并,哈希等),哈希聚合,数组中的主要索引,空间search等select,可以非常快速地计划非常复杂的查询。

这个应用程序将托pipe在您自己的服务器上或托pipe公司吗? 确保如果您使用托pipe公司,他们支持select的数据库。

这两个数据库之间有一个主要的许可区别,如果您打算使用数据库来分发代码,将会影响到您。 MySQL的客户端库是GPL,而PostegreSQL则是BSD类似的许可证,可能更容易处理。