今天我们就来聊聊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 |
身份列 | 有 | 无 |
解析函数 | 有 | 无 |
数据类型 | 支持许多高级类型,例如array、hstore和用户定义的 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 会更容易一些。有时候,功能多并不意味着好,择适合自己的才是最好的 。