数据库对比

起因

一直在思索MySQL成功的原因,所以向一些业界的朋友请教探讨,得出一点极为简单的东西如下:

总结:

MySQL的成功是随同互联网成长、LAMP成长、MySQL的DBA成长而成长的(功能逐步完善),它突出的特点是:因简单而易用/免费/开源/因插件框架而易扩展/复制功能领先/性能好。

1 因简单而易用: 解决了新人快速上手的需求(入门问题)

2 免费: 解决了平民也要使用数据库的需求(资金问题)

3 开源: 解决了深度探索的需求(闭源恐惧问题)

4 因插件框架而易扩展: 解决了未来发展的需求(发展问题)

5 复制功能领先: 解决了DBA以简单方式保证数据可靠的需求(维护问题)

6 性能好:够用而不掉链(可用问题)

再总结:平民化


这些内容简单还不足以说明问题,许多朋友也关心数据库选型的问题,所以作个深度的剖析,通过对PostgreSQL/MySQL/Oracle分析,以此达到:

1 客观性:只做比较不做评述,保持客观公正的立场。

2 全面性:从历史/技术/服务/运维/应用/市场/未来等角度做比较,其中技术是重点。

3 多角度:面对目前的版本,从技术实现/使用方式等角度去比较,前者是从代码的角度看问题,后者是从用户的角度看问题,使得本文力求更为“客观+全面”。

约定

数据库版本约定

1 MySQL V5.6.x及以上,如果有特殊需要,可单独标明版本。

2 PostgreSQL V9.2.x及以上,如果有特殊需要,可单独标明版本。

3 Oracle V12c及以上,如果有特殊需要,可单独标明版本。

历史

数据库技术简史

Oracle数据库简史

PostgreSQL数据库简史

MySQL数据库简史

技术

概述

产品形态与组件组成

架构图

1 MySQL的架构图

MySQL架构.jpg

2 PostgreSQL的架构图

PostgreSQL架构.jpg

3 Oracle的架构图

Oracle架构.png

或参见: http://blog.163.com/li_hx/blog/static/1839914132014426115250298/

基本架构
1 多进程/多线程架构

MySQL是多线程结构。PostgreSQL是多进程结构。Oracle和平台有关,可认为是多进程/多线程共用的结构。

1.在UNIX平台上,Oracle/PostgreSQL使用多进程模式;MySQL使用单进程多线程模式。

2.在Windows平台上,Oracle/MySQL使用多线程模式, PostgreSQL用多进程模式。

3.Oracle采用独立的监听进程监听用户的连接请求

4.PostgreSQL采用主进程作为监听用户连接请求

5.MySQL采用主线程作为监听用户连接请求

在后台进程或线程方面:

1. Oracle后台进程包括:数据库写进程Database Writer (DBW0 or DBWn)、日志写进程Log Writer (LGWR)、检查点进程Checkpoint (CKPT)、系统监视器进程System Monitor (SMON)、进程监视器进程Process Monitor (PMON)、归档进程Archiver (ARCn)、恢复进程Recoverer (RECO)、锁管理器进程Lock (LCK0)、队列管理器进程Job Queue (SNPn)、队列监视器进程Queue Monitor (QMNn)、调度器进程Dispatcher (Dnnn)、服务器进程Server (Snnn)。

2. PostgreSQL后台线程包含:主服务进程、系统恢复进程、系统写进程、写日志进程、数据库统计进程、空间清理进程、归档进程、输出信息写进程、流复制进程。

3. MySQL(以InnoDB为默认的存储引擎)后台线程包含: 主线程、 脏页刷出线程、事务回滚线程、IO线程(参数确定,可能有多个)锁超时监控线程(解决死锁)、错误监控线程、InnoDB监控线程(打印输出InnoDB监控信息)、缓存刷出的线程(参数确定,可能有多个)、执行purage协调操作的线程、执行purge执行操作的线程(参数确定,可能有多个)、缓存池加载与导出线程、词典统计收集信息线程、全文检索服务线程、 全文检索并行排序线程(参数确定,可能有多个)、性能监控线程(PFS)、复制相关线程等。

 

  三者的主要差异:PostgreSQL比Oracle多出: 数据库统计进程、空间清理进程、输出信息写进程、流复制线进。比Oracle缺少:系统监视器进程、锁管理进程、队列管理器进程、队列监视器进程、调度器进程。
  PostgreSQL对每一个客户连接,产生一个相应服务线程。和客户端是一对一关系。
  Oracle根据连接方式的不同,产生专用服务器进程或共享服务器进程。其中,专用服务器进程和客户端是一对一关系,共享服务器进程可以是一对多关系。此外,在共享服务器进程存在前提下,还将有一个数据库调度器进程负责任务分派。
2 内存管理方式

1. PostgreSQL,启动过程中,通过参数shared_buffers从操作系统分配一块内存,作为数据页面缓存,这是Pg对内存的自管理方式。之后,数据库运行期间,所需的内存(如数据页的缓存/日至页的缓存/排序和连接运算使用的缓存/锁使用的内存/临时使用的内存),从进程的全局堆中分配。 这块内存,大小不可在运行期间改变,这是一个弊端。


可参考:

http://blog.163.com/li_hx/blog/static/183991413201162723517837/?suggestedreading&wumii

2. Oracle,启动过程中,通过一些参数的控制,从操作系统分配内存,主要是PGA和SGA。 PGA,Program Global Area,程序全局区,是服务器进程(Server Process)使用的一块包含“数据和控制信息”的内存区域,PGA是非共享的内存,在服务器进程启动或创建时分配,并为Server Process排他访问。 SGA,System Global Area,系统全局区,用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,在数据库实例启动时分配,当实例关闭时释放,每个实例都有自己的SGA区。


可参考:

http://geeksun.iteye.com/blog/549815

或:

http://blog.csdn.net/xmallwood/article/details/8981692

http://blog.csdn.net/xmallwood/article/details/8981725


3. MySQL,启动过程中,通过一些参数的控制,从操作系统分配内存供系统的一些信息使用,但对于数据缓存(最主要的缓存),却不是以统一方式管理的,这点和PG/Oracle等数据库非常不同。MySQL通过join buffer提供对所需数据的读写管理。


可参考:

http://wenku.baidu.com/link?url=z8nOsxn_C9nWGWM88DLqOm9xUavnXZekS_bfLbWwoJE3rVKakSeGiYwzMVd_vaJGEZIXAp2vN04wOVYYgI7fDJPVl2BeRgKAXH9XWdEE6LG

产品特性

1 一些产品功能特性的对比,参考:

http://wenku.baidu.com/link?url=bFC6bA3MdWyYlrYLTAjCqE576Yy6Wwt8ekJY7MsaWmliwMsIkujDoGMoaTMIR4KZAmIelbxHMi5_BN8Jxo1frfPWCHt-S88tDdgmvg6Hx1_

http://bbs.chinaunix.net/thread-1688208-1-1.html

2

MySQL的产品特性
Oracle的产品特性
PostgreSQL的产品特性

PostgreSQL具有以下主要产品特性:

1 标准通用:实用、高效的通用数据库管理系统

PostgreSQL 基于广泛应用的关系数据模型,遵循SQL国际标准。 PostgreSQL 经过大量实际应用的磨合与验证,已成为标准、通用、安全、稳定、实用、高效的数据存储与管理平台。

2 简便易用:图形化交互式管理工具

PostgreSQL 提供了多种图形化交互管理工具,用于对数据库进行方便、高效的管理,如PostgreSQL Manager,phpPgAdmin等。

3 海量存储:强大的大规模数据存储与管理能力

PostgreSQL 结合结构化查询语言的操作能力和过程化语言的数据处理能力,可以有效地支持大规模数据存储与存取,如TB级的数据库的表空间、GB 级的 BLOB 二进制大对象和 CLOB 文本大对象等,并通过各种约束保证数据的完整性和安全性。

4 数据安全:较高的安全性

为应对数据安全保护需求,PostgreSQL V6通过身份鉴别、系统权限、对象权限(表级q权限、列级权限)、用户权限,以及数据访问、传输(利用SSL)等方面的安全性增强提高了数据库系统的整体安全性,可以在一定程度上应对多样的数据安全管理的业务场景,保障数据的安全(但数据的安全,最大的威胁依旧是操作系统)。

5 跨越平台:平台无关性,适用于不同操作系统

PostgreSQL 服务器内核可跨越平台运行在 Windows、Linux、UNIX 等操作系统之上。

6 标准接口:标准化应用接口

PostgreSQL 为应用开发提供了符合标准的 ODBC 3.0、JDBC 3.0、OLEDB 2.7和嵌入式 SQL 接口,应用软件开发者可使用常用的各种开发工具,通过这些接口,进行复杂的商业应用开发。PostgreSQL 服务器端的服务进程与客户端应用通过标准的TCP/IP接口通信。SQL语言符合SQL:1992标准的入门级和过渡级,SQL:1999和SQL:2003的核心级。

7 支持数据库核心功能。

7.1 真正的事务型数据库,完全支持ACID四大特性。

7.2 数据库完整性支持良好,主外键特性完善(实体完整性,参照完整性)。约束特性完善(用户自定义完整性)。

7.3 用户可定义的对象类型丰富。包括:数据库,模式,表,视图,索引,各种约束(NOT NULL/主外键/CHECK),触发器,储存过程,用户自定义函数。丰富的数据类型。

7.4 用户可定义内存空间。数据缓存区的管理(设置share_buffer变量)。

7.5 存储:用户可定义存储位置,但表空间的管理方式有待继续完善(适用到V9.4)。可参见:

PostgreSQL的数据存储---目录 http://blog.163.com/li_hx/blog/static/183991413201172483824324/

PostgreSQL 和 MySQL 存储层深度解析 http://wenku.baidu.com/link?url=7lhpBejDLB4KfR8VrliKNexGtIGtLd4dNsXpcpZNDTW44OMivT1eKiuvgZmN9lROUPn0rBUr5nYrwLrv3vowzacgEevW4scvWZqmTMlDivu

7.6 并发的支持:MVCC实现并发读不冲突。各种锁(自旋锁,轻量锁,锁)和各种对象的不同级别的锁(读锁,写锁,意向锁)的实现保护了竞争的相同资源。

7.7 查询优化技术的支持。高效的查询优化器和执行器,保证了查询执行的效率。 参见: 《数据库技术丛书·数据库查询优化器的艺术:原理解析与SQL性能优化》 http://blog.163.com/li_hx/blog/static/183991413201401343151445/

数据库基本概念

数据库服务器的实例结构

数据库对象

数据库完整性约束

数据库的用户和权限

存储结构

事务管理

安全机制

高可靠管理

逻辑备份还原

归档与物理备份恢复

复制与Standby

SQL基础

SQL的语法基础

伪列

数据类型

操作符

表达式

函数

SQL语句

模式管理

用户权限管理

查询语句

数据更新

事务处理

保存点

预编译

参数设置

远程连接对象

物理联机全系统备份

查看SQL执行计划

存储模块(PL/SQL语言)

存储过程

用户自定义函数

触发器

匿名块

接口驱动程序

JDBC

ODBC

其他

外围管理与辅助工具

连接池

1 PostgreSQL提供连接池的功能

http://www.craigkerstiens.com/2014/05/22/on-connection-pooling/

可用的组件主要有:

1.1 PG Bouncer(http://pgfoundry.org/projects/pgbouncer)

1.2 PG Pool(http://www.pgpool.net/mediawiki/index.php/Main_Page)

相关项目

其他能力

跨平台能力

MySQL、PostgreSQL、Oracle都支持多种平台,这是一种软件的兼容能力,主要包括2个方面,一是向上兼容,二是向下兼容,这样才能构成完整的软件生态链:

一 向上兼容,通常指的是软件的支持

1 编程语言:

 支持编程语言访问数据库,如支持Java使用JDBC访问数据库,支持C/C++使用ODBC访问数据库.
 MySQL、PostgreSQL、Oracle都支持多种数据库驱动程序来访问数据库。

2 中间件:

 典型如Tomcat、Weblogic等中间件,通常需要和数据库密切配合,实现一些特定的高效的功能。

二 向下兼容,通常指的是软件的依赖

1 硬件平台:

 支持各种架构的CPU。

2 操作系统平台

 支持各种操作系统。

数据库操作系统支持对比表(继续增加操作系统)

对比项 MySQL(5.6) PostgreSQL(9.3.x) Oracle(12c)
Windows XP 32-bits Y Y Y
Windows 7 64-bits Y Y Y
Unix Y Y Y
Free BSD   Y  
Debian   Y

 

JSON支持能力

MySQL、PostgreSQL都对JSON提供了支持,用以对Key-Value式的应用提供支持。

PostgreSQL另外提供了更高效率的JSONB数据类型,以支持JSON。

 

1.什么是PostgreSql

PostgreSQL是一个功能强大的开源对象关系型数据库系统,他使用和扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可以追溯到1986年,作为加州大学伯克利分校POSTGRES项目的一部分,并且在核心平台上进行了30多年的积极开发。

PostgresSQL凭借其经过验证的架构,可靠性,数据完整性,强大的功能集,可扩展性以及软件背后的开源社区的奉献精神赢得了良好的声誉,以始终如一地提供高性能和创新的解决方案。PostgreSQL在所有主要操作系统开始使用PostgreSQL从未如此简单。

 

2.为什么要使用PostgreSQL

PostgreSql提供了许多功能,旨在帮助开发人员构建应用程序,管理员保护数据完整性并且构建容错环境,并帮助你管理数据,无论数据集的大小。除了免费和开源之外,Postgre SQL还具有高度的可扩展性。例如,你可以定义自己的数据类型,构建自定义SQL函数(此sql函数在另一篇帖子讨论:点此跳转),甚至可以编写来自不同编程语言的代码,而不需要重新编译数据库。

PostgreSql试图符合SQL标准,在这种标准中,这种一致性不会与传统特性相矛盾,或者可能导致糟糕的架构决策。支持SQL标准所需的许多功能,但是有时候语法或者功能略有不同。随着时间的推移,可以预期进一步向一致性迈进。从2018年10月发布的11版本开始,PostgreSQL符合SQL:2011核心一致性的179个强制性功能中的至少160个,在此之前,没有任何关系型数据库符合此标准的完全符合。

 

3.下面是PostgreSQL中的各种功能介绍

数据类型
1.基本类型:Integer, Numeric, String, Boolean
2.结构类型:Date/Time, Array, Range, UUID
3.文档类型:JSON/JSONB, XML, Key-value(Hstore)
4.几何类型:Point, Line, Circle, Polygon
5.自定义类型:Composite, Custom Types
 

数据的完整性
1.唯一性,不为空
2.主键
3.外键
4.排除约束
5.显式锁定,咨询锁定
 

并发性,性能
1.索引
2.高级索引
3.复杂的查询计划期/优化器
4.交互
5.多版本并发控制(MVCC)
6.读取查询的并行化和构建B树索引
7.表分区
8.Sql标准中定义的所有事物隔离级别,包括Serializable
9.即时表达式汇编(JIT)
 

可靠性,灾难恢复
1.预写日志(WAL)
2.复制:异步,同步,逻辑
3.时间点恢复(pitr),主动备用
4.表空间
 

安全性
1.身份验证:GSSAPI, SSPI, LDAP, SCRAM-SHA-256, 证书等
2.强大的访问控制系统
3.列和行级安全性
 

可扩展性
1.存储的功能和程序
2.程序语言:PL/PGSQL, Perl, Python (more)
3.外部数据包装器:使用标准SQL接口连接到其他数据库或流
4.许多提供附加功能的扩展,包括PostGIS
 

国际化,文本搜索
1.支持国际字符集,例如通过ICU校对
2.全文检索
 

对比Mysql
1.PostgreSQL的稳定性极强,Innodb等引擎在崩溃、断电之类的灾难场景下抗打击能力有了长足的进步,然而很多Mysql用户都遇到过Server级的数据库丢失的场景---Mysql系统库是MyISAM的,相较而言,PG数据库在这方面要好一些。


2.任何系统都有他的性能极限,在高并发读写,负载逼近极限下,PG的性能指标仍然可以维持双曲线甚至对数曲线,到顶峰之后不再下降,而MySQL明细出现一个波峰后下滑。


3.PG多年在GIS领域处于优势地位,因为它有丰富的几何类型,实际上不止几何类型,PG中有大量的字典、数组、bitmap等数据类型,相比之下MaySQL就差很多,insagram就是因为PG的空间数据库扩展POSTGIS远远强于MySQL的my spatial而采用PGSQL的。


4.PG的“无锁定”特性非常突出,甚至包括vacuum这样的整理数据空间的操作,这个和PGSSQL的MVCC实现有关系。


5.PG的可以使用函数和条件索引,这使得PG数据库的调优非常灵活,mysql就没有这个功能,条件索引在web应用中很重要。


6.PG有极其强悍的SQL编程能力,有丰富的统计函数和统计语法支持,比如分析函数(Oracle的叫法,PG里面叫Window函数),还可以用多种语言来写存储过程,对于R的支持也很好。这一点上MySQL就差的很远,很多分析功能那个都没有,腾讯内部数据存储主要是Mysql,但是主要的数据分析就是Hadoop+PGsql。


7.PG的有很多中集群架构可以选择,plproxy可以支持语句级的镜像或者分片,slony可以进行字段级的同步设置,standby可以构建WAL文件级或者流式的读写分离集群,同步频率和集群策略调整方便,操作非常简单。


8.一般关系型数据库的字符串有限定长度8k左右,无限长Text类型的功能受限,只能作为外部大数据访问。而PG的TEXT类型可以直接方法,SQL语法内置正则表达式,可以索引,还可以全文检索,或使用xml xpath。用PG的话,文档数据库就可以省略了


9.对于web应用来说,复制的特性很重要,Mysql到现在也是异步复制,pgsql可以做到同步,异步,半同步复制。还有mysql的同步是基于binlog复制,类似oracle golden gate, 是基于stream的复制,做到同步很困难,这种方式更加适合异地复制,pgsql的复制基于wal,可以做到同步复制。同时pgsql还提供stream复制。


10.Pgsql对于numa架构的支持要比mysql强一些,比mysql对于读的性能要好些,pgsql提交可以完全异步,而mysql的内存表不够实用(表锁原因)

 

PostgreSQL和MySQL对比

下面我将从以下几个方面阐述MySQL和PostgreSQL的异同和优劣:

开源性:
PostgreSQL: The world’s most advanced open source database。

开源协议:PostgreSQL基于自由的BSD/MIT许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声明即可。
PG的开源协议特别灵活,任何公司的和个人都可以把PG作为一个产品销售,而不需要像MySQL那样必须修改大部分代码才可以作为公司的产品。
MySQL:World’s Most Popular Open Source Database。

开源协议:核心代码基于GPL或Commercial License。
MySQL的开源协议是基于GPL协议,任何公司都可以免费使用,不允许修改后和衍生的代码做为闭源的商业软件发布和销售,MySQL的版权在甲骨文手中,甲骨文可以推了其商业闭源版本。
事务支持:
PostgreSQL支持事务的强一致性,事务保证性好,完全支持ACID特性。
MySQL只有innodb引擎支持事务,事务一致性保证上可根据实际需求调整,为了最大限度的保护数据,MySQL可配置双一模式,对ACID的支持上比PG稍弱弱。
SQL标准支持:
PostgreSQL几乎支持所有的SQL标准,支持类型相当丰富。
MySQL只支持部分SQL标准,相比于PG支持类型稍弱。
数据复制:
MySQL的复制是基于binlog的逻辑异步复制,无法实现同步复制。

复制模式:

一主一备

一主多备

级联复制

循环复制

主主复制

数据流转优势:通过canal增量数据的订阅和消费,可以同步数据到kafka,通过kafka做数据流转。

MySQL所有的高可用方案都是基于binlog做的同步,以及基于MySQL的分布式数据也是基于MySQL的binlog实现,binlog是MySQL生态圈最基本技术实现。

PostgreSQL可以做到同步,异步,半同步复制,以及基于日志逻辑复制,可以实现表级别的订阅和发布。

复制模式:

一主一备。

一主多备。

级联复制。

热备库/流复制。

逻辑复制。

数据流转优势:通过逻辑复制实现消息的订阅和消费,可以同步数据到kafka,通过kafka实现数据流转。

并发控制:
PostgreSQL通过其MVCC实现有效地解决了并发问题,从而实现了非常高的并发性。

PG新老数据一起存放的基于XID的MVCC机制,新老数据一起存放,需要定时触发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。

当然PostgreSQL还有一点影响比较,为了保证事务的强一致性,未决事务会影响所有表VACUUM清理,导致表膨胀。

MySQL仅在InnoDB中支持MVCC(并发版本控制)。

innodb的基于回滚段实现的MVCC机制,但是MySQL的间隙锁影响较大,锁定数据较多。

性能方面:
PostgreSQL:

PostgreSQL广泛用于读写速度高和数据一致性高的大型系统。此外,它还支持各种性能优化,当然这些优化仅在商业解决方案中可用,例如地理空间数据支持,没有读锁定的并发性等等。
PostgreSQL性能最适用于需要执行复杂查询的系统。
PostgreSQL在OLTP/ OLAP系统中表现良好,读写速度以及大数据分析方面表现良好,基于PG的GP数据库,在数据仓库领域表现良好。
PostgreSQL也适用于商业智能应用程序,但更适合需要快速读/写速度的数据仓库和数据分析应用程序。
MySQL:

MySQL是广泛选择的基于Web的项目,需要数据库只是为了简单的数据事务。但是,当遇到重负载或尝试完成复杂查询时,MySQL通常会表现不佳。
MySQL的读取速度,在OLTP系统中表现良好。
MySQL + InnoDB为OLTP场景提供了非常好的读/写速度。总体而言,MySQL在高并发场景下表现良好。
MySQL是可靠的,并且与商业智能应用程序配合良好,因为商业智能应用程序通常读取很多。
高可用方面:
PostgreSQL

基于流复制的异步、同步主从。
基于流复制的–keepalive。
基于流复制的 –repmgr。
基于流复制的 –patroni+etcd。
共享存储HA(corosync+pacemaker)。
Postgres-XC。
Postgres-XL。
中间件实现:pgpool、pgcluster、slony、plploxy。
MySQL

主从复制。
主主复。
MHA。
LVS+KEEPALIVE。
MGR分布式数据库,多点写入[不建议],基于paxos协议。
PXC分布式数据库,多点写入[不建议],基于令牌环协议。
INNODB CLUSTER[8.0新技术,基于MGR实现,上层封装命令],基于paxos协议。
中间件实现:mycat。
外部数据源:
PostgreSQL FDW –[foreign-data wrapper的一个简称,可以叫外部封装。

PostgreSQL不支持多数据引擎。但支持Extension组件扩充,以及通过名为FDW的技术将Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV文件等作为外部表进行读写操作,因此,可以为大数据与关系型数据库提供良好对接。

MySQL:无。

数据存储和数据类型:
PG主表采用堆表存放,存放的数据量较大,数据访问方式类似于Oracle的堆表。
MySQL采用索引组织表,MySQL必须有主键索引,所有的数据访问都是通过主键实现,二级索引访问时,需要扫描两遍索引(主键和二级索引)。
PostgreSQL与MySQL优劣对比
PostgreSQL相对于MySQL的优势:

在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨。
存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力。
对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强。
PG主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。
MySQL的存储引擎插件化机制,存在锁机制复杂影响并发的问题,而PG不存在。
PG对可以实现外部数据源查询,数据源的支持类型丰富。
PG原生的逻辑复制可以实现表级别的订阅发布,可以实现数据通过kafka流转,而不需要其他的组件。
PG支持三种表连接方式,嵌套循环,哈希连接,排序合并,而MySQL只支持嵌套循环。
PostgreSQL源代码写的很清晰,易读性比MySQL强太多了。
PostgreSQL通过PostGIS扩展支持地理空间数据。地理空间数据有专用的类型和功能,可直接在数据库级别使用,使开发人员更容易进行分析和编码。
可扩展型系统,有丰富可扩展组件,作为contribute发布。
PostgreSQL支持JSON和其他NoSQL功能,如本机XML支持和使用HSTORE的键值对。它还支持索引JSON数据以加快访问速度,特别是10版本JSONB更是强大。
PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgreSQL数据库不会被其它公司控制。相反,MySQL现在主要是被Oracle公司控制。
MySQL相对于PG的优势:

innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。新老数据一起存放,需要定时触 发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。
MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束。
MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作。
MySQL相对于PG在国内的流行度更高,PG在国内显得就有些落寞了。
MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。
总结:
总体上来说,开源数据库都不是很完善,商业数据库oracle在架构和功能方面都还是完善很多的。从应用场景来说,PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM),但不仅仅限制于此,PostgreSQL的json,jsonb,hstore等数据格式,特别适用于一些大数据格式的分析;而MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、facebook、alibaba),当然现在MySQL的在innodb引擎的大力发展,功能表现良好。

MySQL和PostgreSQL复杂的开源关系型数据库,本文只是作者根据自己经验写的对PG和MySQL的理解,难免有不当之处,不当之处还请大家多多指正。

MySQL在国内的发展已然很成熟,但是如果你转向PostgreSQL,会发现不一样的天地,学院派的风格,丰富的功能,肯定会给你带来不一样的惊喜。

 
posted @ 2021-12-20 21:26  hanease  阅读(425)  评论(0编辑  收藏  举报