在这些版本之前,人们普遍认为,Postgres 在功能集表现更出色,MySQL 则更善长大规模并发读/写。但是随着它们最新版本的发布,两者之间的差距明显变小了。

特性比较

特性

MySQL 8

PostgreSQL 10

查询 & 分析

 

 

公用表表达式 (CTEs)

✔ New


窗口函数

✔ New


数据类型

 

 

JSON 支持

✔ Improved


GIS / SRS

✔ Improved


全文检索



可扩展性

 

 

逻辑复制


✔ New

半同步复制


✔ New

声明式分区


✔ New

 

过去经常会说 MySQL 最适合在线事务,PostgreSQL 最适合分析流程。但现在不是了

公共表表达式(CTEs) 和窗口函数是选择 PostgreSQL 的主要原因。但是现在,通过引用同一个表中的 boss_id 来递归地遍历一张雇员表,或者在一个排序的结果中找到一个中值(或 50%),这在 MySQL 上不再是问题。

在 PostgreSQL 中进行复制缺乏配置灵活性,这就是 Uber 转向 MySQL 的原因。但是现在,有了逻辑复制特性,就可以通过创建一个新版本的 Postgres 并切换到它来实现零停机升级。在一个巨大的时间序列事件表中截断一个陈旧的分区也要容易得多。

就特性而言,这两个数据库现在都是一致的。

 

有哪些不同之处呢?

现在,我们只剩下一个问题 —— 那么,选择一个而不选另一个的原因是什么呢?

生态系统是其中一个因素。MySQL 有一个充满活力的生态系统,包括 MariaDB、Percona、Galera 等等,以及除 InnoDB 以外的存储引擎,但这也可能是和令人困惑的。Postgres 的高端选择有限,但随着最新版本引入的新功能,这会有所改变。

治理是另一个因素。当 Oracle(或最初的 SUN)收购 MySQL时,每个人都担心他们会毁掉这个产品,但在过去的十年里,这并不是事实。事实上,在收购之后,发展反倒加速了。而 Postgres 在工作管理和协作社区方面有着丰富的经验。

基础架构不会经常改变,虽然近来没有对这方面的详细讨论,这也是值得再次考虑的。

来复习下:

特性

MySQL 8

PostgreSQL 10

架构

单进程

多进程

并发

多线程

fork(2)

表结构

 聚簇索引


页压缩

Transparent

TOAST

更新

In-Place / Rollback Segments

Append Only / HOT

垃圾回收

清除线程

自动清空进程

事务日志

REDO Log (WAL)

WAL

复制日志

Separate (Binlog)