我的Django项目将由一个包含数十万个条目的大型数据库支持,并且需要支持搜索(我可能最终会使用djangosearch或类似的项目。)
哪个数据库后端最适合我的项目?为什么?你能推荐任何好的资源进一步阅读吗?
答案 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中的FULLTEXT索引是一个笑话。
未提及的其他原因是非常智能的查询优化器,大量选择的连接类型(合并,散列等),散列聚合,数组上的gist索引,空间搜索等,这些都可以在非常复杂的查询上实现极快的计划
答案 8 :(得分:1)
此应用程序是在您自己的服务器上还是由托管公司托管?如果您使用托管公司,请确保他们支持所选择的数据库。
答案 9 :(得分:0)
如果您打算使用db分发代码,那么两个db之间存在重大的许可差异,这会影响您。 MySQL的客户端库是GPL,PostegreSQL是BSD之类的许可证,可能更容易使用。
答案 10 :(得分:0)
在MySQL开发的最后阶段,因为我很熟悉MySQL(并努力寻找合适的安装程序和对postgreSQL缓慢的Web“工作台”界面的快速测试使我失望),部署几个月后,在研究备份选项时,我发现您必须为MySQL的企业支持功能付费。刚好在最后。
我不得不在Django中编写一些丑陋的原始SQL查询,因为每个组都没有选择不同的条目来检索每个组的最新查询。还查看了postgreSQL的全文本搜索,并希望我使用过postgresSQL。
即使您熟悉MySQL,我也建议使用PostgreSQL,但是您的学习目标可能会有所不同。