- 一、特性、功能和优势方面的一些差异如下:
- 二、PostgreSQL相对于MySQL的优势
- 三、MySQL相对于PG的优势
- 四、其它对比
- 1. CPU限制
- 2. 配置文件参数
- 3. 第三方工具依赖情况
- 4. 高可用主从复制底层原理
- 5. 从库只读状态
- 6. 版本分支
- 7. SQL特性支持
- 8. 主从复制安全性
- 9. 多字段统计信息
- 10. 索引类型
- 11. 物理表连接算法
- 12. 子查询和视图性能
- 13. 执行计划即时编译
- 14. 并行查询
- 15. 物化视图
- 16. 插件功能
- 17. check约束
- 18. gpu 加速SQL
- 19. 数据类型
- 20. 跨库查询
- 21. 备份还原
- 22. 性能视图
- 23. 安装方式
- 24. DDL操作
- 25. 大版本发布速度
- 26. returning语法
- 27. 内部架构
- 28. 聚集索引
- 29. 空闲事务终结功能
- 30. 应付超大数据量
- 31. 分布式演进
- 32. 数据库的文件名和命名规律
- 33. 权限设计
- 34. 发展历史
一、特性、功能和优势方面的一些差异如下:
- 数据库类型
- MySQL:关系型
- PostgreSQL:对象关系
- 编程语言
- MySQL: C/C++
- PostgreSQL: C
- 支持级联
- MySQL:没有
- PostgreSQL:是的
- 用户界面
- MySQL:工作台 GUI
- PostgreSQL: PgAdmin
- 支持的过程复杂度
- MySQL: SQL 语法和存储过程
- PostgreSQL:高级过程和存储过程
- 支持的索引类型
- MySQL:二叉搜索树(B-Tree)
- PostgreSQL:很多,包括 GIN 和 Hash
- 客户端和服务器之间的加密
- MySQL:传输层安全 (TLS) 协议
- PostgreSQL: SSL
- XML 数据类型支持
- MySQL:没有
- PostgreSQL:是的
- 支持物化视图和表继承
- MySQL:没有
- PostgreSQL:是的
- 支持高级数据类型
- MySQL:没有
- PostgreSQL:是的——hstore 和用户定义的 tdtaa
- 支持多版本并发控制 (MVCC)
- MySQL:没有
- PostgreSQL:是的
总之,PostgreSQL 和 MySQL 都有不同的用途,它们之间的选择取决于企业目标和资源。一般来说,PostgreSQL 是一个更强大、更高级的数据库管理系统,非常适合需要在大型环境中快速执行复杂查询的组织。但是,对于预算和空间更受限制的公司来说,MySQL 是一个理想的解决方案。二、PostgreSQL相对于MySQL的优势
1、在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨;
2、存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力;
3、对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强;
4、PG主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
5、PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。
6、MySQL的存储引擎插件化机制,存在锁机制复杂影响并发的问题,而PG不存在。
三、MySQL相对于PG的优势
1、innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。因此MySQL的速度是高于PG的;
2、MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束;
3、MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作;
4、MySQL分区表的实现要优于PG的基于继承表的分区实现,主要体现在分区个数达到上千上万后的处理性能差异较大。
四、
目录
PG具备更高的可靠性,对数据一致性完整性的支持高于MySQL,因此PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM);而MySQL查询速度较快,更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、facebook、alibaba)
具体表现如下:
PostgreSQL 和 MySQL 在用途、好处、特性和特点上的异同
PostgreSQL 和 MySQL 是将数据组织成表的关系数据库。这些表可以根据每个表共有的数据链接或关联。关系数据库使您的企业能够更好地了解可用数据之间的关系,并帮助获得新的见解以做出更好的决策或发现新的机会。
PostgreSQL 和 MySQL 有何相似之处?
PostgreSQL 和 MySQL 都依赖于 SQL(结构化查询语言),这是与管理系统交互的标准语言。SQL 允许使用具有简单结构的几行源代码连接表,大多数非技术员工可以快速学习。
使用 SQL,分析师不需要知道订单表在磁盘上的位置、如何执行查找以查找特定订单或如何连接订单表和客户表。数据库编译查询并计算出正确的数据点。
MySQL 和 PostgreSQL 都支持 JavaScript Object Notation (JSON) 来存储和传输数据,尽管 PostgreSQL 也支持 JSONB,这是 JSON 的二进制版本,它消除了重复键和无关空格。
除了传统的支持机制外,这两个数据库都提供强大的社区支持。
什么是 PostgreSQL?
PostgreSQL,也称为 Postgres,是一种开源关系数据库,因其可靠性、灵活性和对开放技术标准的支持而享有盛誉。PostgreSQL 支持非关系和关系数据类型。它被称为当今可用的最兼容、最稳定和最成熟的关系数据库之一,并且可以轻松处理复杂的查询。
PostgreSQL 的特性包括:
- 时间点恢复 (PITR) 将数据库还原到特定时间点。
- 使用 pgBackRest 等工具记录对数据库的所有更改的预写日志 (WAL)。
-
PostgreSQL是如何使用的?
PostgreSQL 是一个“一刀切”的解决方案,适用于许多寻求经济高效的方法来改进其数据库管理系统 (DBMS) 的企业。它具有足够的可扩展性和通用性,可以通过强大的扩展生态系统快速支持各种专业用例,涵盖时间序列数据类型和地理空间分析等工作。作为开源数据库解决方案构建的 PostgreSQL 完全不受许可限制、供应商锁定的可能性或过度部署的风险。PostgreSQL 通过对象关系数据库管理系统 (ORDBMS) 进行管理。
PostgreSQL 为负责管理业务活动的在线事务处理 (OLTP)协议的企业数据库管理员提供了理想的解决方案,包括电子商务、客户关系管理系统 (CRM) 和财务分类帐。它也是管理接收、创建和生成的数据分析的理想选择。PostgreSQL 的好处
这些是 PostgreSQL 的一些主要优点:
性能和可扩展性——包括地理空间支持和无限制的并发性——以及跨多种数据类型的深入、广泛的数据分析。
- 通过使用多版本并发控制 (MVCC)支持并发,这使得写操作和读操作同时发生。
- 由于它的兼容性和对多种编程语言的支持,包括Python、Java、JavaScript、C/C++ 和 Ruby,因此支持深度语言。
- 业务连续性,通过跨服务器的异步或同步复制方法提供高可用性服务。
-
什么是 MySQL 数据库?
MySQL — 一种快速、可靠、可扩展且易于使用的开源关系数据库系统 — 旨在处理关键任务、高负载的生产应用程序。它是一种常见且易于启动的数据库,内存、磁盘和 CPU 利用率较低,由关系数据库管理系统 (RDMS) 管理。MySQL Community Edition 是一个由活跃的在线社区支持的免费下载版本。
MySQL 功能包括所有 SQL 标准命令以及事务和 ACID 合规性(代表原子性、一致性、隔离性和持久性)。
两个最常见的关系数据库是 MySQL 和 Oracle。MySQL 不是 SQL Server 的同义词,SQL Server 是 Microsoft 许可产品,与 MAC OS X 缺乏兼容性。
MariaDB 经常与 MySQL 混淆,它是 MySQL 的一个开源分支,速度更快,提供更多存储引擎 (12),但功能有限。MySQL 和 MariaDB 使用的存储引擎都是 InnoDB。InnoDB 提供标准的 ACID 兼容特性。与 MySQL 不同,MariaDB 不支持数据屏蔽或动态列。fMySQL是如何使用的?
MySQL 通常用作 Web 数据库来存储各种信息类型,从单个信息数据点到为组织提供的产品或服务的完整列表。它是LAMP(Linux 操作系统、Apache HTTP 服务器、MySQL RDBMS 和 PHP 编程语言)的基础组件,这是一种有助于创建API、Web 应用程序和网站的软件堆栈模型。
MySQL Workbench 是一个单一的、集成的可视化 SQL 平台,用于 MySQL 数据库的创建、开发、设计和管理。MySQL的好处
MySQL 为市场提供了许多好处,包括:
与其他数据库管理平台相比,无与伦比的数据安全性是由于它使用了安全套接字层 (SSL)。这有助于确保数据完整性,使其成为 Web 应用程序的流行数据库。
- 高性能,因为 MySQL 的存储引擎框架支持具有高速部分索引、全文索引和独特内存缓存的要求苛刻的应用程序,以实现卓越的数据库性能。
可扩展性和对在小空间内无限存储增长的支持。
支持事务处理的灵活开源框架,但不如 NoSQL 等非关系数据库灵活。PostgreSQL vs MySQL:有什么区别?
PostgreSQL 和 MySQL 之间有很多不同之处。特性、功能和优势方面的一些差异如下:
数据库类型
- MySQL:关系型
- PostgreSQL:对象关系
- 编程语言
- MySQL: C/C++
- PostgreSQL: C
- 支持级联
- MySQL:没有
- PostgreSQL:是的
- 用户界面
- MySQL:工作台 GUI
- PostgreSQL: PgAdmin
- 支持的过程复杂度
- MySQL: SQL 语法和存储过程
- PostgreSQL:高级过程和存储过程
- 支持的索引类型
- MySQL:二叉搜索树(B-Tree)
- PostgreSQL:很多,包括 GIN 和 Hash
- 客户端和服务器之间的加密
- MySQL:传输层安全 (TLS) 协议
- PostgreSQL: SSL
- XML 数据类型支持
- MySQL:没有
- PostgreSQL:是的
- 支持物化视图和表继承
- MySQL:没有
- PostgreSQL:是的
- 支持高级数据类型
- MySQL:没有
- PostgreSQL:是的——hstore 和用户定义的 tdtaa
- 支持多版本并发控制 (MVCC)
- MySQL:没有
- PostgreSQL:是的
总之,PostgreSQL 和 MySQL 都有不同的用途,它们之间的选择取决于企业目标和资源。一般来说,PostgreSQL 是一个更强大、更高级的数据库管理系统,非常适合需要在大型环境中快速执行复杂查询的组织。但是,对于预算和空间更受限制的公司来说,MySQL 是一个理想的解决方案。
四、其它对比
链接:https://www.zhihu.com/question/20010554/answer/2320511271
1. CPU限制
PGSQL没有CPU核心数限制,有多少CPU核就用多少
MySQL能用128核CPU,超过128核用不上
2. 配置文件参数
PGSQL一共有255个参数,用到的大概是80个,参数比较稳定,用上个大版本配置文件也可以启动当前大版本数据库
MySQL一共有707个参数,用到的大概是180个,参数不断增加,就算小版本也会增加参数,大版本之间会有部分参数不兼容情况
3. 第三方工具依赖情况
PGSQL只有高可用集群需要依靠第三方中间件,例如:patroni+etcd、repmgr
MySQL大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,学习成本高,高可用集群也需要第三方中间件,官方MGR集群还没成熟
4. 高可用主从复制底层原理
PGSQL物理流复制,属于物理复制,跟SQL Server镜像/AlwaysOn一样,严格一致,没有任何可能导致不一致,性能和可靠性上,物理复制完胜逻辑复制,维护简单
MySQL主从复制,属于逻辑复制,(sql_log_bin、binlog_format等参数设置不正确都会导致主从不一致)大事务并行复制效率低,对于重要业务,需要依赖 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比较和修复主从一致主从复制出错严重时候需要重搭主从MySQL的逻辑复制并不阻止两个不一致的数据库建立复制关系
5. 从库只读状态
PGSQL系统自动设置从库默认只读,不需要人工介入,维护简单
MySQL从库需要手动设置参数super_read_only=on,让从库设置为只读,super_read_only参数有bug,链接:https://baijiahao.baidu.com/s?id=1636644783594388753&wfr=spider&for=pc
6. 版本分支
PGSQL只有社区版,没有其他任何分支版本,PGSQL官方统一开发,统一维护,社区版有所有功能,不像SQL Server和MySQL有标准版、企业版、经典版、社区版、开发版、web版之分国内外还有一些基于PGSQL做二次开发的数据库厂商,例如:Enterprise DB、瀚高数据库等等,当然这些只是二次开发并不算独立分支
MySQL由于历史原因,分裂为三个分支版本,MariaDB分支、Percona分支 、Oracle官方分支,发展到目前为止各个分支基本互相不兼容Oracle官方分支还有版本之分,分为标准版、企业版、经典版、社区版
7. SQL特性支持
PGSQLSQL特性支持情况支持94种,SQL语法支持最完善,例如:支持公用表表达式(WITH查询)
MySQLSQL特性支持情况支持36种,SQL语法支持比较弱,例如:不支持公用表表达式(WITH查询)关于SQL特性支持情况的对比,可以参考:http://www.sql-workbench.net/dbms_comparison.html
8. 主从复制安全性
PGSQL同步流复制、强同步(remote apply)、高安全,不会丢数据PGSQL同步流复制:所有从库宕机,主库会罢工,主库无法自动切换为异步流复制(异步模式),需要通过增加从库数量来解决,一般生产环境至少有两个从库手动解决:在PG主库修改参数synchronous_standby_names =’’,并执行命令:pgctl reload ,把主库切换为异步模式主从数据完全一致是高可用切换的第一前提,所以PGSQL选择主库罢工也是可以理解MySQL增强半同步复制 ,mysql5.7版本增强半同步才能保证主从复制时候不丢数据mysql5.7半同步复制相关参数:参数rpl_semi_sync_master_wait_for_slave_count 等待至少多少个从库接收到binlog,主库才提交事务,一般设置为1,性能最高参数rpl_semi_sync_master_timeout 等待多少毫秒,从库无回应自动切换为异步模式,一般设置为无限大,不让主库自动切换为异步模式所有从库宕机,主库会罢工,因为无法收到任何从库的应答包手动解决:在MySQL主库修改参数rpl_semi_sync_master_wait_for_slave_count=0
9. 多字段统计信息
10. 索引类型
PGSQL多种索引类型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表达式索引)
MySQLbtree 索引,全文索引(低效),表达式索引(需要建虚拟列),hash 索引只在内存表
11. 物理表连接算法
PGSQL支持 nested-loop join 、hash join 、merge join
MySQL只支持 nested-loop join
12. 子查询和视图性能
PGSQL子查询,视图优化,性能比较高
MySQL视图谓词条件下推限制多,子查询上拉限制多
13. 执行计划即时编译
PGSQL支持 JIT 执行计划即时编译,使用LLVM编译器
MySQL不支持执行计划即时编译
14. 并行查询
PGSQL并行查询(多种并行查询优化方法),并行查询一般多见于商业数据库,是重量级功能
MySQL有限,只支持主键并行查询
15. 物化视图
16. 插件功能
PGSQL支持插件功能,可以丰富PGSQL的功能,GIS地理插件,时序数据库插件, 向量化执行插件等等
MySQL不支持插件功能
17. check约束
PGSQL支持check约束
MySQL不支持check约束,可以写check约束,但存储引擎会忽略它的作用,因此check约束并不起作用(mariadb 支持)
18. gpu 加速SQL
PGSQL可以使用gpu 加速SQL的执行速度
MySQL不支持gpu 加速SQL 的执行速度
19. 数据类型
PGSQL数据类型丰富,如 ltree,hstore,数组类型,ip类型,text类型,有了text类型不再需要varchar,text类型字段最大存储1GB
MySQL数据类型不够丰富
20. 跨库查询
PGSQL不支持跨库查询,这个跟Oracle 12C以前一样
MySQL可以跨库查询
21. 备份还原
PGSQL备份还原非常简单,时点还原操作比SQL Server还要简单,完整备份+wal归档备份(增量)假如有一个三节点的PGSQL主从集群,可以随便在其中一个节点做完整备份和wal归档备份
MySQL备份还原相对不太简单,完整备份+binlog备份(增量)完整备份需要percona的XtraBackup工具做物理备份,MySQL本身不支持物理备份时点还原操作步骤繁琐复杂
22. 性能视图
PGSQL需要安装pg_stat_statements插件,pg_stat_statements插件提供了丰富的性能视图:如:等待事件,系统统计信息等不好的地方是,安装插件需要重启数据库,并且需要收集性能信息的数据库需要执行一个命令:create extension pg_stat_statements命令否则不会收集任何性能信息,比较麻烦
MySQL自带PS库,默认很多功能没有打开,而且打开PS库的性能视图功能对性能有影响(如:内存占用导致OOM bug)
23. 安装方式
PGSQL有各个平台的包rpm包,deb包等等,相比MySQL缺少了二进制包,一般用源码编译安装,安装时间会长一些,执行命令多一些
MySQL有各个平台的包rpm包,deb包等等,源码编译安装、二进制包安装,一般用二进制包安装,方便快捷
24. DDL操作
PGSQL加字段、可变长字段类型长度改大不会锁表,所有的DDL操作都不需要借助第三方工具,并且跟商业数据库一样,DDL操作可以回滚,保证事务一致性
MySQL由于大部分DDL操作都会锁表,例如加字段、可变长字段类型长度改大,所以需要借助percona-toolkit里面的pt-online-schema-change工具去完成操作将影响减少到最低,特别是对大表进行DDL操作DDL操作不能回滚
25. 大版本发布速度
PGSQLPGSQL每年一个大版本发布,大版本发布的第二年就可以上生产环境,版本迭代速度很快PGSQL 9.6正式版推出时间:2016年PGSQL 10 正式版推出时间:2017年PGSQL 11 正式版推出时间:2018年PGSQL 12 正式版推出时间:2019年
MySQLMySQL的大版本发布一般是2年~3年,一般大版本发布后的第二年才可以上生产环境,避免有坑,版本发布速度比较慢MySQL5.5正式版推出时间:2010年MySQL5.6正式版推出时间:2013年MySQL5.7正式版推出时间:2015年MySQL8.0正式版推出时间:2018年
26. returning语法
PGSQL支持returning语法,returning clause 支持 DML 返回 Resultset,减少一次 Client <-> DB Server 交互
MySQL不支持returning语法
27. 内部架构
PGSQL多进程架构,并发连接数不能太多,跟Oracle一样,既然跟Oracle一样,那么很多优化方法也是相通的,例如:开启大页内存
MySQL多线程架构,虽然多线程架构,但是官方有限制连接数,原因是系统的并发度是有限的,线程数太多,反而系统的处理能力下降,随着连接数上升,反而性能下降一般同时只能处理200 ~300个数据库连接
28. 聚集索引
PGSQL不支持聚集索引,PGSQL本身的MVCC的实现机制所导致
MySQL支持聚集索引
29. 空闲事务终结功能
PGSQL通过设置 idle_in_transaction_session_timeout 参数来终止空闲事务,比如:应用代码中忘记关闭已开启的事务,PGSQL会自动查杀这种类型的会话事务
MySQL不支持终止空闲事务功能
30. 应付超大数据量
PGSQL不能应付超大数据量,由于PGSQL本身的MVCC设计问题,需要垃圾回收,只能期待后面的大版本做优化
MySQL不能应付超大数据量,MySQL自身架构的问题
31. 分布式演进
PGSQLHTAP数据库:cockroachDB、腾讯Tbase分片集群:Postgres-XC、Postgres-XLMySQLHTAP数据库:TiDB分片集群:各种各样的中间件,不一一列举
32. 数据库的文件名和命名规律
PGSQLPGSQL在这方面做的比较不好,DBA不能在操作系统层面(停库状态下)看清楚数据库的文件名和命名规律,文件的数量,文件的大小一旦操作系统发生文件丢失或硬盘损坏,非常不利于恢复,因为连名字都不知道PGSQL表数据物理文件的命名/存放规律是:在一个表空间下面,如果没有建表空间默认在默认表空间也就是base文件夹下,例如:/data/base/16454/3599base:默认表空间pg_default所在的物理文件夹16454:表所在数据库的oid3599:就是表对象的oid,当然,一个表的大小超出1GB之后会再生成多个物理文件,还有表的fsm文件和vm文件,所以一个大表实际会有多个物理文件由于PGSQL的数据文件布局内容太多,大家可以查阅相关资料当然这也不能全怪PGSQL,作为一个DBA,时刻做好数据库备份和容灾才是正道,做介质恢复一般是万不得已的情况下才会做
MySQL数据库名就是文件夹名,数据库文件夹下就是表数据文件,每个表都有对应的frm文件和ibd文件,存储元数据和表/索引数据,清晰明了,做介质恢复或者表空间传输都很方便
33. 权限设计
PGSQLPGSQL在权限设计这块是比较坑爹,抛开实例权限和表空间权限,PGSQL的权限层次有点像SQL Server,db=》schema=》object要说权限,这里要说一下Oracle,用Oracle来类比在ORACLE 12C之前,实例与数据库是一对一,也就是说一个实例只能有一个数据库,不像MySQL和SQL Server一个实例可以有多个数据库,并且可以随意跨库查询而PGSQL不能跨库查询的原因也是这样,PGSQL允许建多个数据库,跟ORACLE类比就是有多个实例(之前说的实例与数据库是一对一)一个数据库相当于一个实例,因为PGSQL允许有多个实例,所以PGSQL单实例不叫一个实例,叫集簇(cluster),集簇这个概念可以查阅PGSQL的相关资料PGSQL里面一个实例/数据库下面的schema相当于数据库,所以这个schema的概念对应MySQL的database注意点:正因为是一个数据库相当于一个实例,PGSQL允许有多个实例/数据库,所以数据库之间是互相逻辑隔离的,导致的问题是,不能一次对一个PGSQL集簇下面的所有数据库做操作必须要逐个逐个数据库去操作,例如上面说到的安装pg_stat_statements插件,如果您需要在PGSQL集簇下面的所有数据库都做性能收集的话,需要逐个数据库去执行加载命令又例如跨库查询需要dblink插件或fdw插件,两个数据库之间做查询相当于两个实例之间做查询,已经跨越了实例了,所以需要dblink插件或fdw插件,所以道理非常简单权限操作也是一样逐个数据库去操作,还有一个就是PGSQL虽然像SQL Server的权限层次结构db=》schema=》object,但是实际会比SQL Server要复杂一些,还有就是新建的表还要另外授权在PGSQL里面,角色和用户是一样的,对新手用户来说有时候会傻傻分不清,也不知道怎么去用角色,所以PGSQL在权限设计这一块确实比较坑爹
MySQL使用mysql库下面的5个权限表去做权限映射,简单清晰,唯一问题是缺少权限角色user表db表host表tables_priv表columns_priv表
34. 发展历史
PGSQL在1995年,开发人员Andrew Yu和Jolly Chen在Postgres中添加了一个SQL(Structured Query Language,结构化查询语言)翻译程序,该版本叫做Postgres95,在开放源代码社区发放。在1996年,再次对Postgres95做了较大的改动,并将其命名为PostgresSQL 6.0版发布,PostgresSQL 的名字就此定型,从1995年算起,大概有24年历史
MySQL在1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris操作系统下的二进制版本,一个月后,Linux版本出现从1996年算起,大概有23年历史
