百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

PostgreSQL vs. MySQL,该怎么选呢

toyiye 2024-06-21 12:23 10 浏览 0 评论

大家好,我是老七,关注我,将持续更新更多精彩内容!

今天我们就来聊聊PostgreSQL和MySQL,大象和海豚我们到底该选哪个呢?

先放一张对比表格:


PostgreSQL

MySQL

许可

MIT-style license

GNU General Public License

编程语言

C

C/C++

可视化工具

PgAdmin

MySQL Workbench

ACID支持

存储引擎

单一存储引擎

多种存储引擎,例如InnoDB和MyISAM

全文搜索支持

是(有限)

删除临时表

在DROP TABLE语法中没有TEMP或者TEMPORARY关键字

在DROP TABLE语法语句中支持TEMP或者TEMPORARY关键字,只允许删除临时表。

删除表(DROP TABLE)

支持CASCADE删除表的依赖对象的选项,例如表和视图。

不支持CASCADE选项。

删除表(TRUNCATE TABLE)

PostgreSQL TRUNCATE TABLE支持更多功能,如CASCADE、RESTART IDENTITY、CONTINUE IDENTITY、 事务安全等。

MySQL TRUNCATE TABLE 不支持CASCADE和事务安全。数据一旦删除,就无法回滚。

自动递增列

SERIAL

AUTO_INCREMENT

身份列

解析函数

数据类型

支持许多高级类型,例如arrayhstore用户定义的 type

SQL标准类型

无符号整数

布尔类型

使用TINYINT(1)来表示布尔类型

IP地址数据类型

设置列的默认值

同时支持常量和函数调用

必须是常量或者TIMESTAMP或者DATETIME 列设置CURRENT_TIMESTAMP为默认值

CTE(通用表表达式)

有(MySQL 8.0支持)

EXPLAIN输出

更多详情信息

较少的信息

物化视图

检查约束

有(MySQL 8.0.16以后支持, 之前MySQL只是忽略检查)

表继承

存储过程编程语言

Ruby, Perl, Python, TCL, PL/pgSQL, SQL, JavaScript, etc.

SQL:2003存储过程语法

FULL OUTER JOIN

INTERSECT

EXCEPT

部分索引

位图索引

表达式索引

覆盖索引

有(9.2版本之后)

有. MySQL支持覆盖索引,允许仅通过扫描索引来检索数据,而无需接触表数据。这对于具有数百万行的大型表来说是有利的。

触发器

支持可以在大多数类型的命令上触发的触发器,但影响全局数据库的触发器除外,例如角色和表空间。

仅限于某些命令

分区

RANGE, LIST

RANGE、LIST、HASH、KEY 以及使用 RANGE 或 LIST 与 HASH 或 KEY 子分区组合的复合分区

任务调度

pgAgent

Scheduled event

连接可扩展性

每个新连接都是一个操作系统进程

每个新连接都是一个操作系统线程

看完上面的表格,我们基本上对PostgreSQL和MySQL之间的差异有了大概的了解,下面我们详细的说明一下:

语法

就语法而言,Postgresql 和 MySQL 都很相似。以下是两者的选择查询:

SELECT * FROM STUDENTS;

但是,MySQL 不支持多个子查询,例如“LIMIT”或“ALL”。它也不支持标准 SQL 子句,例如“INTERSECT”或“OUTER JOIN”。

MySQL 不像 PostgreSQL 那样完全兼容 SQL,后者支持上述所有子查询。如果您的业务需要经常使用这些子查询,那么 PostgreSQL 将是更合适的选择。

支持的语言

PostgreSQL 和 MySQL 支持许多相同的语言,但存在一些差异。

另一方面,PostgreSQL 提供对更广泛的编程语言的支持:

  • C/ C++
  • Delphi
  • Erlang
  • Go
  • Java
  • Javascript
  • JSON (native since version 9.2)
  • Lisp
  • .NET
  • Python
  • R
  • Tcl
  • Other programming languages

以下是 MySQL 支持的语言列表:

  • C/C++
  • Delphi
  • Erlang
  • Go
  • Java
  • Lisp
  • Node.js
  • Perl
  • PHP
  • R

速度

在决定最适合您的业务需求的数据库时,速度是一个不可或缺的因素。快速的数据库不仅可以确保您的网站运行得更快,而且还可以通过指出可以删除的未使用数据来帮助减轻服务器的压力。

PostgreSQL 和 MySQL 都因是市场上最快的 DBMS 解决方案而闻名。然而,这一类别中没有明显的赢家。您可以很容易地找到基于配置、测试和硬件推荐一种数据库的基准测试。一个可能在并发性方面占据上风,而另一个可能在内存很少的单核机器上表现更好。

最终,这取决于您如何使用它们。众所周知,MySQL 在只读命令方面速度更快,但代价是并发性较高,而 PostgreSQL 在读写操作、海量数据集和复杂查询方面表现更好。

体系结构

MySQL 是一个纯关系数据库,而 PostgreSQL 是一个对象关系数据库。PostgreSQL 提供更复杂的数据类型,并允许对象继承属性。另一方面,它也使得使用 PostgreSQL 变得更加复杂。PostgreSQL 拥有一个单一的、符合 ACID 的存储引擎。除了默认存储引擎 InnoDB 之外,MySQL 还支持 15 种不同的存储引擎。大量的存储引擎允许您快速将它们用于其他用例。

PostgreSQL 通过内存分配为每个建立的客户端连接生成一个新的系统进程。这需要具有许多客户端连接的系统上的大量内存。另一方面,MySQL 使用单个进程并为每个连接维护一个线程。这使得 MySQL 成为企业范围以下应用程序的更合适选择。

表现

PostgreSQL 的构建是为了符合标准、功能丰富且可扩展。此前,PostgreSQL 的性能表现平稳——读取通常比 MySQL 慢,但它可以更有效地写入大量数据。除此之外,PostgreSQL 比 MySQL 更好地处理并发性。

在过去几年中,他们的能力之间的差距已显著缩小。如果您使用旧的 MyISAM 引擎,MySQL 读取数据的速度仍然相当快。它还进行了优化,以在大量数据写入方面赶上 PostgreSQL。

在为您的目的选择合适的工具时,性能不应成为大多数普通应用程序的约束因素。PostgreSQL 和 MySQL 的性能在很大程度上是相同的。

复制和集群

复制是一个允许开发人员将数据从数据库复制到其副本数据库的过程。这确保了每个用户都拥有相同级别的信息。复制还带来了各种好处,例如容错、可扩展性、自动备份以及在不影响主集群的情况下执行长时间查询的能力。

MySQL 和 PostgreSQL 都支持复制。PostgreSQL提供同步复制,这意味着它有两个数据库同时运行,并且主数据库与副本数据库同步。您甚至可以使用 PostgreSQL 执行同步和级联复制。然而,在 MySQL 中,复制是单向异步的。这意味着一台数据库服务器充当主数据库服务器,其他数据库服务器充当副本。

MySQL 和 PostgreSQL 都支持集群。集群利用共享存储将相同的数据集复制到环境中的每个节点。这使得数据库能够容忍故障,因为在环境中的各个节点之间复制数据所产生的冗余。

数据和表结构

JSON 支持仍然是 MySQL 纳入的领先 NoSQL 功能之一。相比之下,PostgreSQL 支持用户定义的类型、数组、hstore 和 XML。能够处理更多数据类型的主要好处是功能的增加。例如,通过接受数组作为数据类型,PostgreSQL 还可以提供与这些数组兼容的主机函数。

然而,尽管使用替代格式存储数据具有优势,但执行此类数据格式可能会更加复杂,因为它们不遵循长期的基准。因此,与数据库一起使用的组件可能并不总是遵循 PostgreSQL 格式。

MySQL在SQL合规性方面仅部分兼容SQL,因为它不支持像无检查约束这样的所有功能。也就是说,它确实提供了很多扩展。

相比之下,PostgreSQL 比 MySQL 更符合 SQL 规范,支持大多数主要 SQL 功能 —准确地说,支持 179 个强制功能中的 160 个。

可扩展性

PostgreSQL 被认为是一种高度可扩展的工具,因为它支持 MySQL 中找不到的各种高级数据类型。这将包括网络地址类型、本机 UUID、几何/GIS、可索引的 JSON 以及时区感知时间戳。如果这没有使 PostgreSQL 在这一轮中成为明显的赢家,您可以添加运算符、数据类型和索引类型。

因此,如果您的应用程序正在处理非结构化数据或任何可用的独特数据类型,PostgreSQL 可能是更好的选择。但是,如果您只处理基本的数字和字符数据类型,那么这两个数据库都应该可以正常工作。

索引

为了提高数据库性能,您可以在处理大型数据表时使用索引来加速 SQL 查询。如果没有索引,查询将会很慢,并且会成为 DBMS 的主要负担。

PostgreSQL 和 MySQL 都提供不同的索引选项。PostgreSQL 索引类型包括以下几种:

  • 部分索引仅排列表的一部分信息
  • B树索引和哈希索引
  • 表达式索引,生成由表达函数而不是列值生成的索引

另一方面,MySQL 提供以下索引选项:

  • 存储在 R 树上的索引,例如在空间数据类型上找到的索引
  • 存储在 B 树上的索引,例如 PRIMARY KEY、INDEX、FULLTEXT 和 UNIQUE
  • 使用 FULLTEXT 索引时的倒排列表和哈希索引

安全

PostgreSQL和MySQL都支持组和用户管理,并为各种角色授予SQL权限。MySQL 支持本机窗口服务、PAM 和 LDAP 进行用户身份验证,而 PostgreSQL 支持使用 Kerberos 和 PAM 的基于 IP 的客户端身份验证和过滤。因此,这两个数据库在安全性方面不相上下。

支持与社区

PostgreSQL 和 MySQL 都有有用的社区来为用户提供支持。

PostgreSQL 拥有庞大的志愿者社区,他们通过邮件列表和 IRC 向用户提供免费建议。除此之外,您甚至可以通过第三方提供商购买付费支持。您甚至可以通过浏览市场上各种有用的 PostgreSQL 书籍和手册来排除故障。

MySQL 也有一个庞大的志愿者社区,他们会花时间为您提供免费建议和支持。您可以在 Percona 和 MySQL 网站上利用此类支持。除了免费社区支持之外,Oracle 还为其所有产品的商业版本提供 24/7 付费支持。与 PostgreSQL 一样,您也可以通过深入研究大量免费且有用的 MySQL 指南、书籍和教程来进行故障排除。

总而言之,对 PostgreSQL 的支持可能有点具有挑战性,因为它需要更多的技术专业知识来设置和使用。此外,目前可供您使用的 PostgreSQL 专家数量少于 MySQL 专家数量。所以,在用户支持和管理方便性方面,MySQL略胜一筹。

总结

总的来说,Postgres 有更多功能、更繁荣的社区和生态;而 MySQL 则更易学习并且拥有庞大的用户群体。

我们观察到了与 Stack Overflow 结果相同的行业趋势,即 Postgres 在开发者中变得越来越受欢迎。但根据我们的实际体验,精密的 Postgres 牺牲了一些便利性。如果你想使用Postgres最好多看看文档,并运行几个查询来上手,有一些学习成本,MySQL 会更容易一些。有时候,功能多并不意味着好,择适合自己的才是最好的 。


如果各位觉得老七的文章还不错的话,麻烦大家动动小手,

点赞、关注、转发走一波!!

有任何问题可以评论区留言或者私信我,我必将知无不言言无不尽!

相关推荐

Asterisk-ARI对通道中的DTMF事件处理

Asterisk通道中关于DTMF处理是一个非常重要的功能。通过DTMF可以实现很多的业务处理。现在我们介绍一下关于ARI对通道中的DTMF处理,我们通过自动话务员实例来说明Asterisk如何创建一...

PyQt5 初次使用(pyqt5下载官网)

本篇文章默认已安装Python3,本篇文章默认使用虚拟环境。安装pipinstallPyQt5PyQt一些图形界面开发工具QtDesigner、国际化翻译工具Liguist需要另外...

Qt开发,使用Qt for Python还是Qt C++ Qt开发,使用Qt for

Qt开发使用QtforPython还是QtC++?1.早些年写过一个PyQt5的项目,最近几年重构成QtC++了,其中有个人原因,如早期代码写得烂,...

最简单方法!!用python生成动态条形图

最近非常流行动态条形图,在B站等视频网站上,此类视频经常会有上百万的播放量,今天我们通过第三方库:bar_chart_race(0.2版本)来实现动态条形图的生成;生成的效果如图:问题:...

Asterisk通道和ARI接口的通信(aau通道数)

Asterisk通道和ARI详解什么是通道Asterisk中,通道是介于终端和Asterisk自己本身的一个通信媒介。它包含了所有相关信息传递到终端,或者从终端传递到Asterisk服务器端。这些信...

Python GUI-长链转短链(长链接转化成短链接java)

当我们要分享某一个链接给别人,或是要把某个链接放入帖子中时,如果链接太长,则会占用大量空间,而且很不美观。这时候,我们可以结束长链转短链工具进行转换。当然可以直接搜索在线的网站进行转换,但我们可以借此...

Python 的hash 函数(python的hash函数)

今天在看python的hash函数源码的时候,发现针对不同的数据类型python实现了不同的hash函数,今天简单介绍源码中提到的hash函数。(https://github.com/pyth...

8款Python GUI开源框架,谁才是你的菜?

作为Python开发者,你迟早都会用到图形用户界面来开发应用。本文千锋武汉Python培训小编将推荐一些PythonGUI框架,希望对你有所帮助。1、Python的UI开发工具包Kivy...

python适合开发桌面软件吗?(python可不可以开发桌面应用软件)

其实Python/Java/PHP都不适合用来做桌面开发,Java还是有几个比较成熟的产品的,比如大名鼎鼎的Java集成开发环境IntelliJIDEA、Eclipse就是用Java开发的,不过PH...

CryptoChat:一款功能强大的纯Python消息加密安全传输工具

关于CryptoChatCryptoChat是一款功能强大的纯Python消息加密安全传输工具,该工具专为安全研究专家、渗透测试人员和红蓝队专家设计,该工具可以完全保证数据传输中的隐私安全。该工具建立...

为什么都说Python简单,但我觉得难?

Python普遍被大家认为是编程语言中比较简单的一种,但有一位电子信息的学生说自己已经学了C语言,但仍然觉得Python挺难的,感觉有很多疑问,像迭代器、装饰器什么的……所以他提出疑问:Python真...

蓝牙电话-关联FreeSwitch中继SIP账号通过Rest接口

蓝牙电话-关联FreeSwitch中继SIP账号通过Rest接口前言上一篇章《蓝牙电话-与FreeSwitch服务器和UA坐席的通话.docx》中,我们使用开源的B2B-UA当中经典的FreeSWIT...

技术分享|Sip与WebRTC互通-SRProxy开源库讲解

SRProxy介绍目前WebRTC协议跟SIP协议互通场景主要运用在企业呼叫中心、企业内部通信、电话会议(PSTN)、智能门禁等场景,要想让WebRTC与SIP互通,要解决两个层面的...

全网第N篇SIP协议之GB28181注册 JAVA版本

鉴于网上大部分关于SIP注册服务器编写都是C/C++/python,故开此贴,JAVA实现也贴出分享GB28181定义了了基于SIP架构的视频监控互联规范,而对于多数私有协议实现的监控系统...

「linux专栏」top命令用法详解,再也不怕看不懂top了

在linux系统中,我们经常使用到的一个命令就是top,它主要是用来显示系统运行中所有的进程和进程对应资源的使用等信息,所有的用户都可以使用top命令。top命令内容量丰富,可令使用者头疼的是无法全部...

取消回复欢迎 发表评论:

请填写验证码