MySQL 向左,PostgreSQL 向右

MySQL 和 PostgreSQL 是我们熟知的两种开源关系型数据库。它们之间有很多共同之处,但也存在一些重要的区别,从而为新手甚至老司机带来了选择上的争论和困难。

本文对这两种数据库系统进行了详细的比较,给出了它们之间的异同,方便大家选择数据库时作为参考。

如果你想要直接知道结论:MySQL 简单易用,适合互联网业务;PostgreSQL 支持丰富的功能和扩展,尤其适合复杂的企业在线应用和分析系统。

基本信息

MySQL 是世界上最流行的开源关系型数据库,目前属于 Oracle 公司所有,最新版本为 MySQL 8.0。MySQL 提供了两种版本:社区版和企业版。其中,社区版使用 GPL 开源协议。MySQL 使用 C/C++ 语言开发,支持 Linux、FreeBSD、OS X、Solaris、Windows 平台。支持插件式存储引擎,InnoDB 和 NDB 支持事务 ACID 属性,兼容大部分 SQL 标准。MySQL 使用多线程模型,每个连接对应一个系统线程。每个 MySQL 实例可以创建多个数据库(模式)。常见的分支包括 MariaDB、Percona、Galera 等。

PostgreSQL 是世界上最先进的开源关系-对象数据库,拥有一个活跃的全球社区,最新版本为 PostgreSQL 15。PostgreSQL 是一个完全开源的软件,使用 BSD 风格的开源协议,使用更加自由。PostgreSQL 使用 C 语言开发,支持 Linux、FreeBSD、NetBSD、OpenBSD、HP-UX、OS X、Solaris、Unix、Windows 平台。支持事务 ACID 属性,兼容绝大多数 SQL 标准。PostgreSQL 使用多进程模型,每个连接对应一个系统进程。每个 PostgreSQL 实例可以创建多个数据库,每个数据库可以创建多个模式。常见的分支包括 Greenplum、EnterpriseDB、TimescaleDB、Citus 等。

功能比较

以下功能比较基于 MySQL 8.0 和 PostgreSQL 15。

SQL 查询

MySQL 提供了比较完善的 SQL 标准支持和扩展,PostgreSQL 提供了非常完善的 SQL 标准支持和扩展。

功能特性MySQLPostgreSQL
无表查询✔️✔️
GROUP BY ROLLUP✔️✔️
GROUP BY CUBE✔️
GROUP BY GROUPING SETS✔️
PIVOTCROSSTAB 表函数
字符串聚合GROUP_CONCAT 函数STRING_AGG 函数
支持数据过滤的聚合函数✔️
行构造函数(ROW)✔️
行构造表达式(WHERE)✔️✔️
SQL 语句中的变量✔️
基于正则表达式的比较条件✔️✔️
基于正则表达式的子串查找✔️✔️
基于正则表达式的子串替换✔️✔️
内连接(INNER JOIN)✔️✔️
左外连接(LEFT OUTER JOIN)✔️✔️
右外连接(RIGTH OUTER JOIN)✔️✔️
全外连接(FULL OUTER JOIN)✔️
交叉连接(CROSS JOIN)✔️✔️
自然连接(NATURAL JOIN)✔️✔️
连接实现算法Nested Loop Join、Hash JoinNested Loop Join、Hash Join、Sort Merge Join
子查询✔️✔️
横向(LATERAL)子查询✔️✔️
并集运算(UNION)✔️✔️
交集运算(INTERSECT)✔️✔️
差集运算(EXCEPT)✔️✔️
通用表表达式(WITH)✔️✔️
递归查询(WITH RECURSIVE)✔️✔️
窗口函数✔️✔️
字符串聚合窗口函数STRING_AGG 函数
数组转换为表(UNNEST)✔️
空值排序顺序(ORDER BY NULLS FIRST/LAST)✔️
支持空值的等值比较(IS [NOT] DISTINCT FROM)<=>✔️
BETWEEN SYMMETRIC 运算符✔️
OVERLAPS 运算符✔️
单个查询中两次引用同一个临时表✔️
并行查询✔️
全文搜索✔️✔️

DML 语句

DML 语句用于对表中的数据执行增删改合操作。

功能特性MySQLPostgreSQL
多行插入语句✔️✔️
插入查询结果(INSERT SELECT)✔️✔️
关联更新UPDATE JOINUPDATE FROM
元组(多字段)更新✔️
SELECT FOR UPDATE NOWAIT✔️✔️
关联删除DELETE JOINDELETE USING
数据合并(MERGE)✔️
数据合并(专用语句)INSERT ON DUPLICATE、REPLACEINSERT ON CONFLICT
DML 语句中的 RETURNING 子句✔️
DML 语句中的 CTE✔️✔️
CTE 中的 DML 语句✔️
DML 操作过程中的读一致性✔️
子查询中引用 DML 目标表✔️

DDL 语句

DDL 语句用于定义、修改、删除数据库中的对象。

功能特性MySQLPostgreSQL
事务型 DDL✔️
计算列✔️✔️
序列✔️
自增字段AUTO_INCREMENTSERIAL、IDENTITY
非阻塞式的索引创建✔️
分区表RANGE、LIST、HASH、KEY 以及子分区RANGE、LIST、HASH
表继承✔️
DROP TABLE不支持 CASCADE 级联删除支持 CASCADE 级联删除
TRUNCATE TABLE不支持 CASCADE 和事务安全性等选项,删除之后无法回滚支持 CASCADE 和事务安全性等选项,在事务中可以回滚
增加字段时指定字段的位置✔️
物化视图✔️
会话级本地临时表✔️✔️

服务器编程

服务器编程在数据库中提供了类似编程语言的功能,例如变量、控制流结构(if-else、while、for)、游标以及异常处理等。

功能特性MySQLPostgreSQL
存储过程SQL 存储过程PL/pgSQL、SQL、Python、Java、JavaScript、Perl、TCL 等
自定义函数✔️✔️
表值函数✔️
自定义聚合函数✔️
函数重载✔️
自定义运算符✔️
触发器DML 触发器DML 触发器和 DDL 触发器
语句级触发器✔️
行级触发器✔️✔️
替代触发器✔️
级联删除操作是否触发删除触发器✔️
动态 SQL 语句✔️
RETURNING 子句✔️
计划任务内置基于 pgAgent 组件
消息队列✔️,NOTIFY/LISTEN

数据类型

MySQL 支持基本的数字、日期、字符串以及空间数据类型。PostgreSQL 支持更丰富的数据类型,包括数字、日期、字符串、空间、IP 地址、数组、范围、UUID、域以及自定义数据类型。

功能特性MySQLPostgreSQL
SQL 标准类型✔️✔️
无符号整型✔️
布尔类型使用 TINYINT 替代✔️
TIME WITH TIME ZONE✔️
TIMESTAMP WITH TIME ZONE✔️
INTERVAL 类型❌,支持 INTERVAL 常量✔️
数组类型✔️
范围类型✔️
枚举类型✔️✔️
集合类型✔️
IP 地址数据类型✔️
UUID✔️
域类型✔️
空间数据类型✔️✔️
自定义数据类型✔️

索引

索引可以用于提高数据库的查询性能;但是索引需要占用额外的磁盘空间,修改数据时也需要进行索引的维护。

功能特性MySQLPostgreSQL
索引类型B-树、哈希、空间、FULLTEXTB-树、哈希、GiST、SP-GiST、GIN、BRIN、布隆过滤器
聚集索引✔️
复合索引✔️✔️
降序索引✔️✔️
部分索引✔️
包含额外字段的索引(INCLUDE)✔️
函数索引✔️✔️
全文索引✔️✔️
不可见索引✔️
自定义函数索引✔️
基于多个字段的信息统计✔️

约束

SQL 标准定义了 6 种完整性约束:非空约束(NOT NULL)、唯一约束(UNIQUE)、主键约束(Primary Key)、外键约束(Foreign Key)、检查约束(CHECK)以及默认值。

MySQL(InnoDB 和 NDB)支持了完整的约束,PostgreSQL 则提供了更多的约束选项。

功能特性MySQLPostgreSQL
非空约束✔️✔️
唯一约束✔️✔️
主键约束✔️✔️
自定义主键约束名称✔️
外键约束InnoDB 和 NDB✔️
外键约束延迟校验✔️
语句级约束校验✔️
外键的级联更新和删除✔️✔️
多字段外键的 MATCH FULL 选项✔️
检查约束✔️✔️
基于自定义函数的检查约束✔️
排除约束✔️
默认值✔️✔️

视图

视图就是一个预定义的查询语句。MySQL 和 PostgreSQL 都提供了视图。

功能特性MySQLPostgreSQL
可更新视图✔️✔️
可更新视图的 WITH CHECK OPTION 选项✔️✔️
基于子查询的视图✔️
基于视图的触发器✔️

NoSQL

MySQL 提供了 JSON 数据类型以及文档操作接口,PostgreSQL 提供了 JSON 以及 XML 数据类型。

功能特性MySQLPostgreSQL
XML 数据类型✔️
XPath✔️✔️
JSON 数据类型✔️✔️
SQL/JSON 路径✔️✔️
JSON 文档类型✔️
文档 CRUD 操作✔️
Key/Value 存储InnoDB memcached 插件hstore 插件

安全性

功能特性MySQLPostgreSQL
用户组/角色✔️✔️
ACL✔️✔️
行级安全✔️
列级授权✔️✔️
加密和安全连接TLS、SSH、LDAP、SHA-256、PAM、证书SSL、SSH、GSSAPI、SSPI、LDAP、SCRAM-SHA-256、MFA、PAM、证书

备份与恢复

备份对于数据库至关重要,因为当数据库出现系统崩溃、硬件故障或者用户误删除数据时,可以利用备份进行恢复。

功能特性MySQLPostgreSQL
逻辑备份mysqldump、mysqlpumppg_dump、pg_dumpall
物理备份Xtrabackup、mysqlbackupBarman、pg_basebackup、pg_probackup

复制与集群

数据库复制可以将数据从主数据库同步到从数据库,可以用于提高系统的可用性和读写性能。

功能特性MySQLPostgreSQL
复制类型逻辑复制物理复制、逻辑复制
复制模式异步复制、半同步复制同步复制、异步复制
集群方案MHA、MGR、InnoDB Cluster、NDB ClusterCitus、Greenplum、Pgpool-II、Slony-I
外部数据集成同构数据库(MySQL)、文本文件(CSV)同构数据库(PostgreSQL)、异构数据库(MySQL、Oracle、SQL Server、SQLite、HBase、Cassandra、ClickHouse、CouchDB、MongoDB、Neo4j、Redis、Hadoop、HIve等)以及文本文件(CSV、JSON、XML等)

总结

MySQL 以其简单易用和卓越的性能而备受欢迎,同时也因功能相对简单和部分 SQL 标准支持而饱受诟病。不过最近几年随着新版本(MySQL 8.0)的发布,弥补了大量缺失的功能,比如通用表表达式、窗口函数、检查约束等等。

PostgreSQL 以其功能强大和可扩展性而备受开发者喜爱,同时也因其学院派的风格而错过了互联网的发展浪潮。随着开源、数字化、国产化的兴起,PostgreSQL 也逐渐迎来了新的发展契机,让我们拭目以待!

如果觉得文章有用,欢迎评论

原文地址:https://tonydong.blog.csdn.net

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,但是对于懂数据库却不熟悉Oracle的同学可能会有一定的障碍。正好在最近的一个项目中碰到了这样一个任务,于是研究了一下Oracle的数据导入导出,在这里跟大家分享一下。......_oracle 迁移方法 对比
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。最近我们在使用MYSQL 8 的情况下(8.025)在数据库运行中出现一个问题 参数prefer_order_i..._mysql prefer_ordering_index
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才成功连上,在这分享一下我的经验,也仅仅是经验分享,有不足的地方欢迎大家在评论区补充交流。_navicat连接opengauss
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成中详述的键/值对和数组。_postgresql json
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgresql 注:navicat老版本可能报错。1.在springboot中引入我们需要的依赖以及相应版本。用代码生成器生成代码后,即可进行增删改查(略)安装好postgresql 略。更改配置信息(注释中有)_mybatisplus postgresql
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解析、修改、删除、更新、强制踢出数据库所有使用用户、连表更新与删除、获取今年第一天、获取近12个月的年月、锁表处理、系统表使用(查询所有表和字段及注释、查询表占用空间)、指定数据库查找模式search_path、postgre备份及还原_pgsql分组取每组第一条
文章浏览阅读3.3k次。上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......_postgresql archive_mode
文章浏览阅读3k次。系统:ubuntu22.04.3目的:利用向日葵实现windows远程控制ubuntu。_csdn局域网桌面控制ubuntu
文章浏览阅读1.6k次。表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。1,继承式分区,分为触发器(trigger)和规则(rule)两种方式触发器的方式1)创建表CREATE TABLE "public"."track_info_trigger_partition" ( "id" serial, "object_type" int2 NOT NULL DEFAULT 0, "object_name..._pg数据表分区的实现
文章浏览阅读3.3k次。物联网平台开源的有几个,就我晓得的有、、thingskit、JetLink、DG-iot(还有其他开源的,欢迎在评论区留言哦!),然后重点分析了下ThingsBoard、ThingsPanel和JetLink,ThingsBoard和Jetlinks是工程师思维产品,可以更多的通过配置去实现开发的目的,ThingsPanel是业务人员思路产品,或者开发或者用,避免了复杂的配置带来的较高学习门槛。ThingsBoard和Jetlinks是Java技术体系的,ThingsPanel是PHP开发的。_jetlinks和thingsboard
文章浏览阅读3.8k次。PostgreSQL 数据类型转换_pgsql数字转字符串
文章浏览阅读7k次,点赞3次,收藏14次。在做数据统计页面时,总会遇到统计某段时间内,每天、每月、每年的数据视图(柱状图、折线图等)。这些统计数据一眼看过去也简单呀,不就是按照时间周期(天、月、年)对统计数据进行分个组就完了嘛?但是会有一个问题,简单的写个sql对周期分组,获取到的统计数据是缺失的,即没有数据的那天,整条记录也都没有了。如下图需求:以当前月份(2023年2月)为起点,往后倒推一年,查询之前一年里每个月的统计数据。可见图中的数据其实是缺少的,这条sql只查询到了有数据的月份(23年的1月、2月,22年的12月)_如何用一条sql查出按年按月按天的汇总
文章浏览阅读3.8k次,点赞66次,收藏51次。PostgreSQL全球开发小组与2022年10月13日,宣布发布PostgreSQL15,这是世界上最先进的开源数据库的最新版本_mysql8 postgresql15
文章浏览阅读1.3k次。上文介绍了磁盘管理器中VFD的实现原理,本篇将从上层角度讲解磁盘管理器的工作细节。_smgrrelationdata
文章浏览阅读1.1k次。PostgreSQL设置中文语言界面和局域网访问_postgressql汉化
文章浏览阅读4.2k次。PostgreSQL 修改数据存储路径_如何设置postgresql 数据目录
文章浏览阅读4.7k次。在项目中用到了多数据源,在连接postgres数据库时,项目启动报错,说数据库连接错误,说dual不存在,网上好多教程都是说数据库查询的时候的大小写问题,而这个仅仅是连接,咋鞥却处理方法是修改application-dev.yml中的配置文件.项目中的druid参数是这样的:确实在配置文件中有个查询语句。_relation "dual" does not exist
文章浏览阅读4.9k次。PostgreSQL是一款强大的关系型数据库,但在实际使用过程中,许多用户经常会遇到慢SQL的问题。这些问题不仅会降低数据库性能,还会直接影响业务流程和用户体验。因此,本文将会深入分析PostgreSQL慢SQL的原因和优化方案,帮助用户更好地利用这个优秀的数据库系统。无论你是初学者还是专业开发者,本文都将为你提供实用的技巧和方法,让你的PostgreSQL数据库始终保持高效快速。_postgresql数据库优化
文章浏览阅读1.6k次。Linux配置postgresql开机自启_linux 启动pgsql
文章浏览阅读2k次。本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构。后续更高级的HA模式都是基于这个最基本的主备搭建。_postgresql主备