【干货总结】:可能是史上最全的MySQL和PGSQL对比材料
【干货总结】:可能是史上最全的MySQL和PGSQL的对比材料
运维了MySQL和PGSQL已经有一段时间了,最近接到一个数据库选型需求,于是便开始收集资料整理了一下,然后就有了下面的对比表
关键词:PostgreSQL 11、MySQL5.7
比较版本:PostgreSQL 11 VS MySQL5.7(innodb引擎) Oracle官方社区版
1. CPU限制
2. 配置文件参数
3. 第三方工具依赖情况
4. 高可用主从复制底层原理
大事务并行复制效率低,对于重要业务,需要依赖 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比较和修复主从一致
主从复制出错严重时候需要重搭主从(借助克隆插件 clone plugin)
MySQL的逻辑复制并不阻止两个不一致的数据库建立复制关系
5. 从库只读状态
6. 版本分支
国内外还有一些基于PGSQL做二次开发的数据库厂商,例如:Enterprise DB、瀚高数据库等等,这些数据库厂商提供企业版PGSQL,拥有企业级功能,当然这些只是二次开发并不算独立分支
Oracle官方分支还有版本之分,分为标准版、企业版、经典版、社区版,社区版没有企业级功能,例如审计插件,非阻塞备份,增量备份等等
7. SQL特性支持
8. 主从复制安全性
同步流复制、强同步(remote apply)、高安全,不会丢数据
PGSQL同步流复制:所有从库宕机,主库会罢工,主库无法自动切换为异步流复制(异步模式),也就是同步复制无法自动降级为异步复制,需要通过增加从库数量来解决,一般生产环境至少有两个从库
手动解决:在PG主库修改参数synchronous_standby_names ='',并执行命令: pgctl reload ,把主库手动切换为异步模式
增强半同步复制 ,mysql5.7版本增强半同步才能保证主从复制时候不丢数据
mysql5.7半同步复制相关参数:
参数rpl_semi_sync_master_wait_for_slave_count 等待至少多少个从库接收到binlog,主库才提交事务,一般设置为1,性能最高
参数rpl_semi_sync_master_timeout 等待多少毫秒,从库无回应自动降级为异步模式,一般设置为无限大,不让主库自动降级为异步模式
所有从库宕机,主库会罢工,因为无法收到任何从库的应答包
9. 多字段统计信息
10. 索引类型
11. 物理表连接算法
12. 子查询和视图性能
13. 执行计划即时编译
14. 并行查询
有限,只支持主键并行查询
15. 物化视图
不支持物化视图
16. 插件功能
支持插件功能,但是插件数量比PGSQL少,innodb引擎之前是MySQL的一个插件,克隆插件、审计插件,只有一些必要的插件
17. check约束
不支持check约束,可以写check约束,但存储引擎会忽略它的作用,因此check约束并不起作用(mariadb数据库 支持)
18. gpu 加速SQL
不支持gpu 加速SQL 的执行速度
19. 数据类型
数据类型不够丰富
20. 跨库查询
可以跨库查询,跟SQL Server一样,特别有利于数据库设计
21. 备份还原
假如有一个三节点的PGSQL主从集群,可以随便在其中一个节点做完整备份和wal归档备份
备份还原相对不太简单,完整备份+binlog备份(增量)
完整备份需要percona的XtraBackup工具做物理备份,社区版MySQL本身不支持物理备份
时点还原操作步骤繁琐复杂,需要把binlog改为relay-log,利用SQL线程去重做日志,非常麻烦
22. 性能视图
不好的地方是,安装插件需要重启数据库,并且需要收集性能信息的数据库需要执行一个命令:create extension pg_stat_statements命令
否则不会收集任何性能信息,比较麻烦
自带PS库,默认很多功能没有打开,而且打开PS库的性能视图功能对性能有影响,性能大概下降10%(例如:内存占用导致MySQL的OOM bug)
23. 安装方式
有各个平台的包rpm包,deb包等等,源码编译安装、二进制包安装,一般用二进制包安装,解压即可使用,方便快捷
24. DDL操作
将影响减少到最低,特别是对大表进行DDL操作
DDL操作不能回滚
25. 大版本发布速度
PGSQL 11 正式版推出时间:2018年
PGSQL 12 正式版推出时间:2019年
MySQL的大版本发布一般是2年~3年,一般大版本发布后的第二年才可以上生产环境,避免有坑,版本发布速度比较慢
MySQL5.5正式版推出时间:2010年
MySQL5.6正式版推出时间:2013年
MySQL5.7正式版推出时间:2015年
MySQL8.0正式版推出时间:2018年
MySQL8.1.0正式版推出时间:2023年
MySQL8.0.34正式版推出时间:2023年
26. returning语法
在 PostgreSQL 中,RETURNING 语法是一个非常有用的功能,允许在执行数据操作语言(DML)语句(如 INSERT、UPDATE 和 DELETE)的同时立即返回受影响行的结果集。 这使得开发者可以减少一次客户端和数据库服务器之间的交互,特别是在需要立即获取更新或插入数据的情况下。 如何使用 RETURNING 语法 1. INSERT 语句中的 RETURNING 在 INSERT 语句中,RETURNING 可以返回插入的数据。例如,当向表中插入数据时,可以直接返回生成的主键值或其他列值: INSERT INTO users (name, age) VALUES ('Alice', 30) RETURNING id; 此语句会插入一条记录并返回生成的 id 值。 2. UPDATE 语句中的 RETURNING UPDATE 语句也可以使用 RETURNING 来返回更新后的值。例如,更新某条记录后,返回该记录的所有列信息: UPDATE users SET age = age + 1 WHERE id = 1 RETURNING *; 此语句将更新用户的 age 字段,并返回更新后的完整记录。 3. DELETE 语句中的 RETURNING 在 DELETE 语句中,RETURNING 可以返回被删除的记录信息: DELETE FROM users WHERE id = 1 RETURNING *; 此语句会删除指定 id 的记录,并返回删除前的记录数据。
27. 内部架构
华为的高斯数据库使用多线程架构,那么就会跟PGSQL的上游越来越疏远,独立出来之后会得不到支持
多线程架构,虽然MySQL使用多线程架构(跟SQL Server一样,但是SQL Server没有连接数限制),但是官方有限制连接数,原因是系统的并发度是有限的,线程数太多,反而系统的处理能力下降,随着连接数上升,反而性能下降
一般同时只能处理200 ~300个数据库连接
28. 聚集索引
innodb引擎默认支持聚集索引,不支持堆表
29. 空闲事务终结功能
不支持终止空闲事务功能
30. 应付超大数据量
不能应付超大数据量,MySQL自身架构的问题,优化器太弱,分区表可以解决一部分问题,但是一般使用物理分库分表的方法
31. 分布式演进
HTAP数据库:TiDB
分片集群: 各种各样的中间件,mycat,爱可生dble,不一一列举
32. 数据库的文件名和命名规律
16454:表所在数据库的oid
3599:就是表对象的oid,当然,一个表的大小超出1GB之后会再生成多个物理文件,还有表的fsm文件和vm文件,所以一个大表实际会有多个物理文件
数据库名就是文件夹名,数据库文件夹下就是表数据文件,但是要注意表名和数据库名不能有特殊字符或使用中文名,每个表都有对应的frm文件和ibd文件,存储元数据和表/索引数据,清晰明了,做介质恢复或者表空间传输都很方便
33. 权限设计
使用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年历史
总结
上面的对比表还不是很完善,只有一些本人认为比较关键的特性拿出来对比
总的来说,两种数据库都有优缺点,大家在选型的时候需要谨慎选择,两种数据库都需要折腾
当然,如果在MySQL上选择Percona 分支,MariaDB分支,或者Oracle官方的MySQL企业版就另当别论
MySQL因为需要支持更换存储引擎,所以某些功能都要受制于存储引擎层,例如:物理复制
而PGSQL不支持更换存储引擎(在PGSQL V12开始也支持可插拨的表存取接口),而且一直由官方统一开发和维护,所以相对比较稳定,功能也比较完善
PGSQL V12 支持可插拨的表存取接口之后,有可能由第三方存储引擎来改进PGSQL本身的MVCC实现机制,而不需要等待官方去解决,聚集索引、undo表空间这些都不再是问题、xid64的问题
本文版权归作者所有,未经作者同意不得转载。