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

时间:2009-02-25 10:52:12

标签: mysql database django postgresql

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

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

11 个答案:

答案 0 :(得分:56)

无论值得什么,Django的创建者都推荐PostgreSQL。

  

如果你没有与任何遗产联系在一起   系统并有自由选择   我们建议使用数据库后端   PostgreSQL,它可以获得罚款   成本,功能,速度之间的平衡   和稳定。 ( Django权威指南,第15页)

答案 1 :(得分:43)

作为最近将项目从MySQL切换到Postgresql的人,我不后悔转换。

从Django的角度来看,主要区别在于Postgresql中更严格的约束检查,这是一件好事,而且手动架构更改(也称为迁移)也更加繁琐。

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

MySQL可以更好地支持全文搜索 。 MySQL内置全文搜索功能,从Django内部支持,但它没用(没有词干,短语搜索等)。我使用django-sphinx作为MySQL中全文搜索的更好选择。

使用Postgresql 8.3内置全文搜索(早期版本需要TSearch模块)。这是一篇很好的教学博客文章:Full-text searching in Django with PostgreSQL and tsearch2

答案 2 :(得分:40)

  

数百个大型数据库   千条记录,

这不是大型数据库,它非常小。

我选择PostgreSQL,因为它有更多的功能。最重要的是这种情况:在PostgreSQL中,您可以使用Python作为过程语言。

答案 3 :(得分:8)

选择你更熟悉的人。 MySQL vs PostgreSQL是一场无休止的战争。它们都是出色的数据库引擎,两者都被主要站点使用。在实践中这无关紧要。

答案 4 :(得分:8)

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

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

MySQL用于处理“短连接”(连接,执行查询,断开连接,has some performances issues with a lot of open connections

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

它可以与Postgresql一起使用,但是连接到Postgresql比连接到MySQL数据库要花费更多(在Postgresql上,每个连接都有自己的进程,它比在MySQL中弹出一个新线程慢得多)。 / p>

然后你会得到一些像查询缓存这样的功能,它们在某些情况下非常有用。 (但你失去了PostgreSQL的精湛文本搜索)

答案 5 :(得分:6)

所有答案都会给桌子带来有趣的信息,但有些信息有点过时了,所以这就是我的一点点。

从1.7开始,migrations现在是Django不可或缺的一部分。所以他们记录了Django开发人员可能想要事先知道的主要区别。

  

Backend Support

     

Django附带的所有后端都支持迁移,如   以及任何第三方后端,如果他们已经编程支持   用于模式更改(通过SchemaEditor类完成)。

     

然而,有些数据库在其他方面比其他数据库更有能力   模式迁移;下面介绍了一些注意事项。

     

的PostgreSQL

     

PostgreSQL是这里所有数据库中最强大的   架构支持;唯一需要注意的是添加默认列   值将导致表的完全重写,时间成比例   它的大小。

     

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

     

的MySQL

     

MySQL缺乏对架构更改周围事务的支持   操作,意味着如果迁移无法应用,您将拥有   手动取消更改以便再次尝试(这是不可能的   回滚到前一点。)

     

此外,MySQL将完全重写几乎每个模式的表   操作并且通常需要与数量成比例的时间   表中的行以添加或删除列。在较慢的硬件上   可能比每百万行差一分钟 - 添加几列   只有几百万行的表格可以锁定您的网站   十分钟。

     

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

     

SQLite的

     

SQLite几乎没有内置的架构更改支持,等等   Django试图通过以下方式模仿它:

     
      
  • 使用新架构创建新表
  •   
  • 复制数据   
  • 放弃旧桌子
  •   
  • 重命名新表以匹配原始名称
  •   
     

这个过程通常运作良好,但可能很慢,偶尔也会   越野车。不建议您在a中运行和迁移SQLite   生产环境,除非你非常了解风险及其风险   限制; Django提供的支持旨在允许   开发人员在本地机器上使用SQLite来减少开发   复杂的Django项目,无需完整的数据库。

答案 6 :(得分:3)

当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)

答案 7 :(得分:2)

添加到之前的答案:

  • “MySQL可能更好地支持全文搜索”

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

  • 它仅适用于MyISAM表,因此您将失去ACID,事务,约束,关系,持久性,并发性等。
  • INSERT / UPDATE / DELETE到一个较大的TEXT列(如论坛帖子)将重建索引的很大一部分。如果它不适合myisam_key_buffer,则会发生大IO。我已经看到一个论坛帖子插入触发100MB或更多的IO ...同时帖子表被排他性锁定!
  • 我做了一些基准测试(3年前,可能是陈旧的...),这表明在大型数据集上,基本上postgres全文比mysql快10-100倍,而Xapian比postgres快10-100倍(但没有集成)

未提及的其他原因是非常智能的查询优化器,大量选择的连接类型(合并,散列等),散列聚合,数组上的gist索引,空间搜索等,这些都可以在非常复杂的查询上实现极快的计划

答案 8 :(得分:1)

此应用程序是在您自己的服务器上还是由托管公司托管?如果您使用托管公司,请确保他们支持所选择的数据库。

答案 9 :(得分:0)

如果您打算使用db分发代码,那么两个db之间存在重大的许可差异,这会影响您。 MySQL的客户端库是GPL,PostegreSQL是BSD之类的许可证,可能更容易使用。

答案 10 :(得分:0)

在MySQL开发的最后阶段,因为我很熟悉MySQL(并努力寻找合适的安装程序和对postgreSQL缓慢的Web“工作台”界面的快速测试使我失望),部署几个月后,在研究备份选项时,我发现您必须为MySQL的企业支持功能付费。刚好在最后。

我不得不在Django中编写一些丑陋的原始SQL查询,因为每个组都没有选择不同的条目来检索每个组的最新查询。还查看了postgreSQL的全文本搜索,并希望我使用过postgresSQL。

即使您熟悉MySQL,我也建议使用PostgreSQL,但是您的学习目标可能会有所不同。