在这些版本之前,人们普遍认为,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) |