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 = x
或update 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中的存储过程更好。