MySQL8与PG10:新版本下的较量谁更胜一筹?数据库

来源:互联网 / 作者:SKY / 2018-06-12 15:19 / 点击:
既然MySQL 8和PostgreSQL 10已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的。在这些版本之前,人们普遍认为,Postgres在功能集表现更出

MySQL8与PG10:新版本下的较量谁更胜一筹?

既然MySQL 8和PostgreSQL 10已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的。

在这些版本之前,人们普遍认为,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时,每个人都担心会毁掉这个产品,但在过去的十年里,这并不是事实。事实上,在收购之后,MySQL的发展反而加速了。而Postgres在工作管理和协作社区方面有着丰富的经验。

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

来复习一下:

特性   MySQL 8   PostgreSQL 10  
架构   单进程   多进程  
并发   多线程   fork(2)  
表结构   聚簇索引    
页压缩   Transparent   TOAST  
更新   In-Place / Rollback Segments   Append Only / HOT  
垃圾回收   清除线程   自动清空进程  
事务日志   REDO Log (WAL)   WAL  
复制日志   Separate (Binlog)   WAL   

进程 vs 线程

当Postgres派生出一个子进程来建立连接时,每个连接最多可以占用10MB。与MySQL的线程连接模型相比,它的内存压力更大,在64位平台上,线程的默认堆栈大小为256KB(当然,线程本地排序缓冲区等使这种开销变得不那么重要,即使在不可以忽略的情况下,仍然如此)。

尽管“写时复制”保存了一些与父进程共享的、不可变的内存状态,但是当你有1000多个并发连接时,基于流程的架构的基本开销是很繁重的,而且它可能是容量规划的最重要因素之一。

也就是说,如果你在30台服务器上运行一个Rails应用,每个服务器都有16个CPU核心32线程,那么你有960个连接。可能只有不到0.1%的应用会超出这个范围,但这是需要记住的。

聚簇索引 vs 堆表

聚簇索引是一种表结构,其中的行直接嵌入其主键的b树结构中。一个(非聚集)堆是一个常规的表结构,它与索引分别填充数据行。

有了聚簇索引,当你通过主键查找记录时,单次I/O就可以检索到整行,而非集群则总是需要查找引用,至少需要两次I/O。由于外键引用和JOIN将触发主键查找,所以影响可能非常大,这将导致大量查询。

聚簇索引的一个理论上的缺点是,当你使用二级索引进行查询时,它需要遍历两倍的树节点,第一次扫描二级索引,然后遍历聚集索引,这也是一棵树。

阅读延展

1
3