数据库:PostgreSQL 和 MySQL对比

比较版本:PostgreSQL 11 VS MySQL5.7(innodb引擎) Oracle官方社区版版权情况:PostgreSQL 11(免费开源)、MySQL5.7 Oracle官方社区版(免费开源)

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. 多字段统计信息

PGSQL支持多字段统计信息

MySQL不支持多字段统计信息

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. 物化视图

PGSQL支持物化视图

MySQL不支持物化视图

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年历史

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#获取当前系统磁盘符、系统目录、桌面等

1.获取方式如下 Environment.SpecialFolder中定义了许多常用的目录 //获取当前系统磁盘符方法1&#xff0c;返回&#xff1a;C: string path Environment.GetEnvironmentVariable("systemdrive"); //获取当前系统磁盘符方法2,返回&#xff1a;C: string path Envir…

MAC电脑常用效率工具推荐

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Java String类型转换成Date日期类型

//格式化数据 SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format sdf.format(new Date()); System.out.println(format);//String格式的数据转化成Date格式 String timeStr "2019-07-09 03:34:56 "; Date parse sdf.pa…

docker php 安装swoole,swoole(1)使用docker安装swoole环境

1.下载镜像pull php 镜像docker pull php:7.3-alpine3.8创建容器docker run -it --name test php:7.3-alpine3.8 sh2.进入容器安装swoole# 安装依赖的第三方包echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \echo http://mirrors.u…

插件书写示例

正常模态框代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

MAC电脑8款常用设计工具推荐

目录 1、Sketch 3 2、Affinity Designer 3、Framer 4、PaintCode 5、Hype 3 Professional 6、Pixave 2 7、Iconjar 8、Sip for Mac and iPhone 1、Sketch 3 Sketch是完全满足我上面4条选择条件的一款UI设计工具&#xff0c;前文第50页已经提到过相关内容。 2、Affinity Designe…

matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...

前提&#xff1a;安装前的文件 的 目录 不需含有 中文安装MATLAB7时弹出以下警告对话框&#xff0c;显示“ The installer cannot read the mwinstall.dll file, This is probably due to a CD reader which can only read files with an eight.three naming convention. Pleas…

专家观点:即使在云中 硬件同样至关重要

英特尔最近发布了新一代企业级CPU。第四代E5和E7CPU确实有些与众不同之处&#xff1a;更多的缓存、更多的内核、更快更多的RAM。但是大家没有发现这款产品还有一个特别的地方。 也许一切都与云有关&#xff0c;我们已经告别以前的硬件。你可能认为IT命令结构级别越高&#xff0…

matlab怎么安装compiler,关于MATLAB中compiler配置问题

按照大家的方法进行了系统配置&#xff0c;下载安装了SDK7.1&#xff0c;可运行mex setup之后还是一直弹出No supported SDK or compiler was found on this computer.Welcome to mex -setup. This utility will help you set upa default compiler. For a list of supported…

计算机硬件:内存条的基础知识笔记

在电脑硬件中&#xff0c;CPU、显卡、内存均三者是重中之重&#xff0c;所以我们在选择这些核心硬件一定要慎重。今天给大家分享一下关于的电脑内存基础知识&#xff0c;让更多的装机朋友们可以更好的学习内存相关知识。 史上最易懂的电脑内存基础知识 内存条的基本概念&#x…

数独Sudoku

数独&#xff08;すうどく&#xff0c;Sūdoku&#xff09;&#xff0c;是源自18世纪瑞士发明&#xff0c;流传到美国&#xff0c;再由日本发扬光大的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据99盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&…

电脑CPU选购的几个指标

CPU的概念介绍 CPU是Central Processing Unit(中央处理器)的缩写&#xff0c;CPU的详细参数包括内核结构&#xff0c; 主频&#xff0c;外频&#xff0c;倍频&#xff0c;接口&#xff0c;缓存&#xff0c;多媒体指令集&#xff0c;制造工艺&#xff0c;电压&#xff0c;封装形…

idea生成方法注释的正确方法

生成方法注释 1.打开File -> Settings 2.Editor -> Live Templates -> 点击右边加号为自己添加一个Templates Group -> 然后选中自己的Group再次点击加号添加Live Templates 重点&#xff1a;Abbreviation那里不要用/开头的&#xff01;&#xff01;&#xff01; …

php linux 缓存文件,Linux下搭建网站提示缓存文件写入失败怎么办?

Linux下搭建网站提示缓存文件写入失败时该怎么处理&#xff1f;基于ThinkPHP框架及Linux环境搭建的网站&#xff0c;经常会遭遇缓存文件写入失败的错误提示&#xff0c;即便是现在流行的P2P网站程序便是如此&#xff0c;具体解决方法请看下文。Linux下搭建网站提示缓存文件写入…

什么是CharSequence

CharSequence是一个接口&#xff0c;比较常见的String、StringBuilder、StringBuffer都实现了这个接口。 当我们看到一个API里面有CharSequence的时候&#xff0c;它也是可以被其子类代替的&#xff0c;一般用String代替即可。

你真的了解显卡吗?显卡基础知识大扫盲

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Servlet的运行方式

通常我们运行servlet需要在web.xml配置文件中&#xff0c;注册我们写好的servlet以及其对应的访问路径。 在学习web开发中&#xff0c;有一种不需要配置便可以直接对servlet进行配置的方式&#xff0c;在web.xml文件中添加如下代码&#xff1a; <servlet><servlet-nam…

matlab中select,[转载]MATLAB阈值获取函数ddencmp、thselect、wbmpen和w

crit(t)wdcbm的调用格式有以下两种&#xff1a;(1)[THR,NKEEP]wdcbm(C,L,ALPHA);(2)[THR,NKEEP]wdcbm(C,L,ALPHA,M);函数wdcbm是使用Birge-Massart算法获取一维小波变换的阈值。返回值THR是与尺度无关的阈值&#xff0c;NKEEP是系数的个数。[C,L]是要进行压缩或消噪的信号在jle…

使用Redis让单号从001递增

最近项目遇到一个需求&#xff0c;单号从001开始递增 下面用到了redis处理 代码如下&#xff1a; public String getId() {String key "providerManager";Long incr getIncr(key);if (incr 0) {incr getIncr(key);//从001开始}DecimalFormat df new DecimalF…

硬件知识:直接拔掉USB移动硬盘会对硬盘造成影响吗?

大家在网上经常可以看到直接拔掉移动硬盘会损坏硬盘的文章。如果说突然拔掉硬盘会造成丢失数据我还有一点相信&#xff0c;但是说会造成损坏硬盘感觉就会有些疑问了。难道USB设备在开始设计时&#xff0c;没有考虑到热插拔这个动作&#xff1f; 移动硬盘在通电工作时&#xff0…