近十年来很多开发者和专业人士对MySQL和PostgreSQL进行了比较,大部分人认为后者性能更优。PostgreSQL的支持者认为它的标准支持和ACID[1]性都超过了MySQL。MySQL还流行的原因在于还有很多Linux的Web程序安装包里带着它,但是自从拥有MySQL版权和商标的Sun被Oracle收购后,人们都在担心MySQL不会像以前那样开放了。同时PostgreSQL不仅快,而且支持JSON,使他成为少数的支持NoSQL的关系型数据库。(小道消息:MySQL的作者Monty Widenius,在MySQL分支建立了和MySQL完全兼容而且不被Oracle拥有的MariaDB。)
MySQL/MariaDB的当前版本是5.7.6,而PostgreSQL版本是9.4.1。
ANSI标准:
MySQL比其早期版本在标准方面更加支持(MySQL说:如果用户喜欢,他们可以支持非标准),但是PostgreSQL从一开始就支持,而MySQL之后才加入。
平局
ACID特性
PostpreSQL有一个存储引擎,MySQL有9个。然而只有两个被广泛使用:MyISAM,InnoDB。MyISAM是最开始的引擎,速度很快但是不支持事务;InnoDB支持事务,而且速度更快,是默认引擎。MySQL的InnoDB引擎和PostgreSQL都完全拥有ACID特性,没有什么区别。
平局
表锁
MyISAM使用表锁来获得更快的速度。当大量读操作时性能表现良好,但是写操作会把整个表锁死,等待写入完成。InnoDB引擎和PostgreSQL使用的是行级锁,又打平。
平局
子查询不确定性
子查询一直以来是MySQL“臭名昭彰”的问题:两层或两层以上子查询效率极低,虽然5.6.5已经有了很大改进,但是PostpreSQL在联合查询表现更加突出,特别是MySQL不支持Full Outer Joins。
PostgreSQL胜
支持JSON和NoSQL
PostgreSQL新增功能,支持使用NoSQL和储存JSON。数据储存比传统关系型数据库更加灵活。
PostgreSQL胜
PostgreSQL其他优势:
更好的许可
PostgrePost拥有MIT-style证书,允许你做任何事情,包括开/闭源的商业用途。而MySQL客户端库为GPL证书,意味着你必须像Oracle支付商业费用,或者提供程序源码。(网站使用MYSQL时候会是个小麻烦;MariaDB使用GPL2证书,并且为MySQL客户端提供限制更少的LGPL证书)
更好的数据完整性
PostgreSQL默认对插入和更新的数据严格检查,而MySQL只有开启了(STRICT_ALL_TABLES/STRICT_TRANS_TAQBLES)才会进行严格检查。
数据库扩展开发
两个数据库都允许扩展开发。MySQL提供有C系列语言的API接口。你甚至可以在MySQL5.7.3之后在InnoDB表中做全文检索。PostgreSQL也有同样的功能,但是支持更多的语言,包括C/C++,Java,.Net,Perl,Python,Ruby,Tcl,ODBC等,甚至可以在单独进程(后台)中运行用户提供的代码。
PostgreSQL在系统目录中提供了关系型数据库的数据库、表、行/列的数据类型、方法、访问方法等信息。用户可以修改系统目录表来扩展数据库。
结论
虽然我已经用了十多年两种数据库,而且MySQL已经有很大的提升,但是不得不承认对PostgreSQL的偏爱。PostgreSQL更好用的许可证,自定义数据类型,表继承,规律的系统和数据库事件。
[1] ACID:指数据库事务正确执行的四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
SQL:Structured Query Language(结构化查询语句)