Postgres 9.1 vs Mysql 5.6 InnoDB?

简单的问题 – 对于2012年需要与ACID兼容的中型/大型数据库,哪个更好?

我已经读了所有关于mySQL和pgSQL的文章(大多数),但是大部分文章分别与第4,5.1和7,8版相关,并且相当过时(2008,2009)。 现在差不多2012年了,所以我想我们可以尝试重新审视这个问题。

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

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

打我! 🙂

PS。 不要把我送到护目镜或维基。 我正在寻找几个特定的​​点,而不是一个概述+我相信StackOverflow比随着'聪明的人'shiny他的光一些随机页面。

附录

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

更好的是 :当涉及到不断增长和变化的需求时,未来是可行的,灵活的。 为了在硬件部门保持低成本,性能也很重要。 熟练劳动力的可用性也是一个因素。

OLTP或OLAP :OLTP

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

所有查询优化器有时是愚蠢的。 在大多数情况下,PostgreSQL并不那么愚蠢。 一些PostgreSQL最新的SQLfunction(窗口函数,recursion的WITH查询等)function非常强大,但如果你有一个愚蠢的ORM,它们可能是不可用的。

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

听起来不是那么大 – 很好,就在一个大箱子的范围之内。

更好的是:当涉及到不断增长和变化的需求时,未来是可行的,灵活的。

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

过去,MySQL对版本号的态度有些放松。 甲骨文负责人可能会改变。 我不熟悉各种叉子的政策。

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

如果硬件变成这个大小的项目的主要组件,我会感到惊讶。

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

这是你的关键决定因素。 如果你有一群经验丰富的Perl + PostgreSQL黑客闲坐着,使用它。 如果你的人知道Lisp和MySQL然后使用它。

OLTP或OLAP:OLTP

PostgreSQL在OLTP上一直很强大。

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

涉及SQLfunction时,PostgreSQL更为先进。

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

  • 可延迟的限制
  • 检查约束
  • 全外连接
    MySQL默默地使用一个内部连接,并有一些语法变体: http : //sqlfiddle.com/#!2/88ff95/1
    SQLFiddle是使用MySQL 5.5.32创build的
  • 侧向连接
  • 正则expression式不适用于UTF-8
  • 正则expression式不支持replace或子string
  • 表函数( select * from my_function()
  • 公用表expression式( MySQL 8.0将有 )
  • recursion查询( MySQL 8.0将有 )
  • 可写CTE
  • 窗口函数( MySQL 8.0将它)
  • 基于函数的索引
  • 部分指数
  • 在事务表上进行全文search (MySQL 5.6支持)
  • 地理信息系统在交易表上的function
  • EXCEPT或INTERSECT运算符
  • 在同一个select语句中不能使用两次临时表
  • 您不能在子select中使用正在更改的表(更新/删除/插入)
  • 您不能创build使用派生表的视图

      create view x as select * from (select * from y); 
  • 语句级别读一致性 – 需要使update foo set x = y, y = xupdate foo set a = b, a = a + 100工作
  • 事务性DDL
  • 排除约束
  • 键/值存储
  • JSON支持 (MySQL 5.7支持JSON,但JSON文档不能被索引)
  • 范围types
  • 数组(包括数组上的索引)
  • angular色(组)来pipe理用户权限
  • 并行查询(因为Postgres 9.6 – 虽然仍然有限)
  • 用户定义的数据types(包括检查约束)
  • 物化视图
  • 自定义聚合

不确定你称之为“易用性”,但是我不想错过的几个现代SQL特性 (CTE,窗口函数)将会为我定义“易用性”。

现在PostgreSQL不是完美的,可能是最令人讨厌的事情,可以调整可怕的VACUUM过程,为一个沉重的写数据库。

作为@a_horse_with_no_name答案的补充,我想列举一些我在PostgreSQL中非常喜欢的特性:

  • 数组数据types ;
  • hstore扩展 – 对于存储key->value数据非常有用,可以在该types的列上创build索引;
  • 各种语言扩展 – 我发现Python在非结构化数据处理方面非常有用;
  • distinct on语法 – 我认为这应该是ANSI SQLfunction,对我来说看起来很自然(而不是语法的MySQL组)。
  • 复合types;
  • loggingtypes;
  • inheritance
  • 版本9.3function:
    • 横向连接 – 我从SQL Server中错过的一件事(它称为外部/交叉应用 );
    • 原生JSON支持 ;
    • DDL触发器 ;
    • recursion的 , 物化的 , 可更新的视图;

以下是使用这些精确版本的一些基准:

http://posulliv.github.io/2012/06/29/mysql-postgres-bench/

我的看法是,对于简单的任务,MySQL的速度快了大约30%,对于更复杂的查询,MySQL的速度也慢了500%,这可能是由于查询优化器。

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