Postgres 9.1 vs Mysql 5.6 InnoDB?

时间:2011-11-18 11:23:46

标签: mysql postgresql

简单的问题 - 对于需要在2012年与ACID兼容的中型/大型数据库,会有什么好处。

我已经阅读了所有关于mySQL vs pgSQL的内容(大多数内容),但这些帖子中的大多数分别与版本4,5.1和7,8有关并且过时(2008,2009)。它几乎是2012年,所以我想我们可以尝试重新审视这个问题。

基本上我想知道PostgreSQL中是否有任何东西超出了MySQL的易用性,可用性和更大的开发人员/知识库。

MySQL的查询优化器仍然是愚蠢的吗?在非常复杂的查询上它仍然超级慢吗?

打我! :)

PS。不要把我送到护目镜或维基。我正在寻找一些不是概述的具体要点+我相信StackOverflow比一些随意的页面更能让'聪明的家伙'发光。

附录

项目规模:假设一个订购系统,每个帐户每天约10-100个订单,几千个帐户,最终每个帐户可以有几百到几千个用户。

擅长:在不断增长和变化的需求方面具有前瞻性和灵活性。在硬件部门保持低成本方面,性能也很重要。此外,熟练劳动力的可用性也是一个因素。

OLTP或OLAP :OLTP

4 个答案:

答案 0 :(得分:72)

PostgreSQL在SQL功能方面要先进得多。

MySQL仍然没有的东西(和PostgreSQL有):

  • 延迟约束
  • 检查约束
  • 全外连接
    MySQL默默地使用具有一些语法变体的内部联接:
    https://rextester.com/ADME43793

  • 横向连接

  • 使用UTF-8的正则表达式don't work (已修复MySQL 8.0
  • 正则表达式不支持replace或substring (与MySQL 8.0一起引入)
  • 表函数(select * from my_function()
  • 公用表表达式(与MySQL 8.0一起引入)
  • 递归查询(随MySQL 8.0推介)
  • 可写的CTE
  • 窗口函数(与MySQL 8.0一起引入)
  • 基于功能的索引
  • 部分索引
  • 在事务表上进行全文搜索(MySQL 5.6支持此功能)
  • 交易表上的GIS功能
  • EXCEPT或INTERSECT运算符
  • 您不能在同一个选择语句中使用两次临时表
  • 您不能在子选择中使用正在更改的表(更新/删除/插入)
  • 您无法创建使用派生表的视图(自MySQL 8.0以来可能)

     create view x as select * from (select * from y);
    
  • 语句级读取一致性。需要例如:。update foo set x = y, y = x
    update foo set a = b, a = a + 100
  • transactional DDL
  • DDL triggers
  • exclusion constraints
  • key/value store
  • 索引完整的JSON文档
  • range types
  • 域名
  • 数组(包括数组上的索引)
  • 用于管理用户权限的角色(组)(MariaDB has themIntroduced with MySQL 8.0
  • 并行查询(因为Postgres 9.6
  • 用户定义的数据类型(包括检查约束)
  • 物化视图
  • 自定义聚合
  • 自定义窗口功能
  • 正确的boolean数据类型
    (将任何可以转换为非零数字的表达式视为“true”是正确的布尔类型)

不确定你称之为“易用性”,但有几个modern SQL features我不想错过(CTE,窗口函数),它将为我定义“易用性”。

现在,PostgreSQL不是完美的,可能是最讨厌的事情,可以调整可怕的VACUUM进程来处理繁重的写入数据库。

答案 1 :(得分:56)

  

MySQL的查询优化器仍然是愚蠢的吗?它仍然超级慢   非常复杂的查询?

所有查询优化器有时都很愚蠢。在大多数情况下,PostgreSQL不那么愚蠢。 PostgreSQL的一些最新SQL功能(窗口函数,递归WITH查询等)非常强大,但如果你有一个愚蠢的ORM,它们可能无法使用。

  

项目规模:说一个约10-100的订购系统   每个帐户的订单/天,几个帐户,最终,每个   可以有几百到几千个用户。

听起来不那么大 - 在一个大盒子的范围内。

  

更擅长:在发展方面具有前瞻性和灵活性   和不断变化的要求。

PostgreSQL拥有一支强大的开发团队,拥有一个扩展的贡献者社区。 Release policy是严格的,只有点发布中的错误修正。始终跟踪错误修正的9.1.x的最新版本。

过去,MySQL对版本号的态度稍微放松一些。这可能会随着Oracle的掌控而改变。我不熟悉各种福利的政策。

  

在硬件部门保持低成本方面,性能也很重要。

如果硬件成为这个规模项目的主要组成部分,我会感到惊讶。

  

熟练劳动力的可用性也是一个因素。

这是你的关键决策者。如果你有一群经验丰富的Perl + PostgreSQL黑客闲置,请使用它。如果你的人知道Lisp和MySQL,那就使用它。

  

OLTP或OLAP:OLTP

PostgreSQL在OLTP上一直很强大。

我个人的观点是,PostgreSQL邮件列表中充满了礼貌,乐于助人,知识渊博的人。您可以与Terabyte数据库和黑客建立直接联系,这些数据库和黑客已经构建了代码的主要部分。支持的质量非常好。

答案 2 :(得分:10)

作为@a_horse_with_no_name answer的补充,我想在PostgreSQL中列出一些我非常喜欢的功能:

答案 3 :(得分:2)

PostgreSQL是一个比较成熟的数据库,它具有更长的历史,它更符合ANSI SQL,它的查询优化器明显更好。 MySQL有不同的存储引擎,如MyISAM,InnoDB,内存,所有这些都是不兼容的,因为在一个引擎上运行的SQL查询在另一个引擎上执行时可能会产生语法错误。 PostgreSQL中的存储过程更好。