说明:本文写于2024年7月,PostgreSQL 17预计2024年9月正式发布,文中基于Beta版本和官方发布说明进行对比,部分特性可能在正式版中有所调整。MySQL 8.4 LTS已于2024年4月正式发布。

数据库选型,是每个技术团队都会遇到的问题。

PostgreSQL和MySQL,是目前最流行的两款开源关系型数据库。PostgreSQL以功能强大、标准兼容著称,被称为"最先进的开源数据库";MySQL以简单易用、生态成熟著称,是互联网时代应用最广泛的数据库。

2024年,两款数据库都发布了重要版本:PostgreSQL 17预计9月发布,带来了性能提升和新功能;MySQL 8.4 LTS在4月发布,是MySQL的第一个LTS(长期支持)版本,将支持到2032年。

这篇文章就来对比一下这两个版本,从功能、性能、生态、易用性、适用场景等方面,聊聊到底该选哪个。

版本背景

先简单介绍一下两个版本的背景。

PostgreSQL 17是PostgreSQL全球开发组的第17个主要版本,预计2024年9月发布。PostgreSQL的大版本每年发布一个,每个版本支持5年。PostgreSQL 17在性能、功能、安全性方面都有不少改进。

MySQL 8.4 LTS是Oracle在2024年4月发布的,是MySQL的第一个LTS版本。在此之前,MySQL的版本支持策略比较复杂,8.0支持到2026年。从8.4开始,MySQL引入了LTS和Innovation两种发布模式:LTS版本每两年发布一个,支持8年;Innovation版本每季度发布一个,支持到下一个LTS发布。

MySQL 8.4 LTS的发布,意味着企业用户有了一个长期稳定的选择,不用频繁升级。这对于对稳定性要求高的企业来说,是个好消息。

功能对比

先从功能方面对比。

SQL标准兼容性

PostgreSQL在SQL标准兼容性方面一直领先。PostgreSQL 17继续加强了对SQL标准的支持,包括更多的窗口函数、更完整的JSON功能、更好的全文搜索。

MySQL 8.4也在不断加强SQL标准支持,8.0版本已经支持了窗口函数、CTE、JSON函数等。但在一些高级功能上,比如复杂的窗口函数、表继承、数组类型、自定义类型等,PostgreSQL还是更全面。

JSON支持

两款数据库都支持JSON类型,但实现方式不同。

PostgreSQL的JSONB类型,支持索引、复杂查询、全文搜索,功能非常强大。PostgreSQL 17进一步优化了JSONB的性能,增加了更多JSON函数。

MySQL的JSON类型也支持索引和常用函数,但在复杂查询和性能方面,不如PostgreSQL的JSONB。不过对于一般的JSON存储和查询,MySQL已经够用了。

全文搜索

PostgreSQL的全文搜索功能很强大,支持多种语言、分词、排名、高亮。PostgreSQL 17优化了全文搜索的性能,增加了对新语言的支持。

MySQL的全文搜索在8.0版本有了很大改进,支持InnoDB的全文索引,支持ngram分词器(对中文友好)。但在功能的丰富度和性能上,还是不如PostgreSQL。

扩展性

PostgreSQL的扩展性是它的一大优势。支持自定义类型、自定义函数、自定义操作符、自定义索引方法。还有丰富的扩展,比如PostGIS(地理信息)、TimescaleDB(时序数据)、pgvector(向量搜索)等。

MySQL的扩展性相对较弱,虽然也支持自定义函数和存储过程,但不如PostgreSQL灵活。不过MySQL 8.4增加了一些新的扩展能力,比如更好的插件支持。

复制和高可用

MySQL的复制一直是它的强项,支持主从复制、半同步复制、组复制(Group Replication)、InnoDB Cluster。生态也很成熟,有MHA、Orchestrator、ProxySQL等工具。

PostgreSQL的复制功能也在不断完善,支持流复制、逻辑复制、同步复制。高可用方案有Patroni、repmgr、pgautofailover等。但在生态的成熟度和工具的丰富度上,MySQL还是略胜一筹。

分区表

两款数据库都支持分区表,但PostgreSQL的分区功能更强大,支持更多分区类型、更灵活的分区策略、分区剪枝也更智能。PostgreSQL 17进一步优化了分区表的性能。

MySQL 8.4的分区表也有改进,但在功能和性能上,还是不如PostgreSQL。

性能对比

性能是大家最关心的方面。

查询性能

PostgreSQL的查询优化器一直被认为是开源数据库里最好的之一。支持复杂的查询计划、多种连接算法、并行查询、JIT编译。PostgreSQL 17进一步优化了查询优化器,提升了复杂查询的性能。

MySQL的查询优化器在8.0版本有了很大改进,支持哈希连接、更好的索引优化。但在复杂查询(多表连接、子查询、CTE)的性能上,PostgreSQL通常更好。

对于简单的主键查询和范围查询,两款数据库的性能差不多,都很快。

写入性能

MySQL的InnoDB存储引擎在写入性能上一直表现不错,特别是在高并发写入的场景下。MySQL 8.4优化了InnoDB的写入性能,减少了锁竞争。

PostgreSQL的写入性能也不错,但在极高并发写入的场景下,可能不如MySQL。不过PostgreSQL 17优化了WAL(预写日志)的写入,提升了写入吞吐量。

并发性能

MySQL在高并发场景下的表现一直很好,这也是它被互联网公司广泛使用的原因之一。MySQL 8.4进一步优化了并发控制,减少了锁等待。

PostgreSQL的并发性能也在不断提升,支持MVCC、快照隔离、并行查询。但在极高并发(几千连接以上)的场景下,PostgreSQL可能需要连接池(如PgBouncer)来辅助。

基准测试

根据一些公开的基准测试(如TPC-C、Sysbench),两款数据库的性能各有千秋:

  • 简单的OLTP场景(读写混合),MySQL通常略快
  • 复杂的查询和分析场景,PostgreSQL通常更快
  • 写入密集型场景,两者差不多,MySQL可能略好
  • 高并发场景,MySQL的连接处理更成熟

当然,基准测试的结果和具体的硬件、配置、 workload 有很大关系,只能作为参考。

易用性对比

安装和配置

MySQL的安装和配置相对简单,默认配置就能跑起来,对新手友好。有很多一键安装包和面板工具(如phpMyAdmin、宝塔面板)。

PostgreSQL的安装也不难,但默认配置比较保守,需要根据硬件进行调优才能发挥最佳性能。对于新手来说,可能需要学习一些PostgreSQL的配置知识。

管理工具

MySQL的管理工具非常丰富,有phpMyAdmin、MySQL Workbench、Navicat、DBeaver等,还有很多云服务商提供的托管服务。

PostgreSQL的管理工具也不少,有pgAdmin、DBeaver、Navicat等,但在数量和普及度上,不如MySQL。

学习曲线

MySQL的学习曲线相对平缓,基本的SQL操作很容易上手。对于简单的应用,不需要太多数据库知识就能用好。

PostgreSQL的功能更丰富,学习曲线相对陡峭一些。但如果只是用基本的SQL功能,PostgreSQL也不难学。

文档

两款数据库的官方文档都很完善。PostgreSQL的文档被认为是开源数据库里最好的之一,内容详细、结构清晰。MySQL的文档也不错,但有时候找特定功能的说明会比较费劲。

生态对比

云服务支持

两款数据库在主流云服务商上都有托管服务:AWS RDS/Aurora、阿里云RDS、腾讯云CDB、华为云RDS等。

MySQL的云服务更成熟,选项更多,价格也相对便宜。PostgreSQL的云服务也在不断完善,很多云服务商都提供了增强版的PostgreSQL(如AWS Aurora PostgreSQL、阿里云PolarDB for PostgreSQL)。

ORM和框架支持

几乎所有的Web框架和ORM都支持MySQL和PostgreSQL。Laravel、Django、Rails、Spring Boot等,对两款数据库的支持都很好。

但有一些框架和工具对MySQL的支持更成熟,比如WordPress、Discuz!等PHP应用,默认只支持MySQL。而PostgreSQL在一些特定领域(如地理信息、科学计算)有更多的专用工具。

社区和人才

MySQL的社区更大,人才更多,遇到问题更容易找到解决方案。招聘MySQL DBA也相对容易。

PostgreSQL的社区也很活跃,近年来增长很快。但人才储备相对MySQL少一些,招聘PostgreSQL DBA可能稍微难一点。

第三方工具

MySQL的第三方工具非常丰富,包括备份工具(xtrabackup)、监控工具(Prometheus + Grafana、Zabbix)、高可用工具(MHA、Orchestrator)、中间件(ProxySQL、MyCat)等。

PostgreSQL的第三方工具也不少,有pgBackRest、pgstatstatements、Patroni、PgBouncer等,但在数量和成熟度上,不如MySQL。

适用场景

说了这么多,到底该选哪个?其实要看具体的场景。

选MySQL的场景:

  • 互联网应用,特别是高并发的OLTP场景
  • 使用WordPress、Discuz!等只支持MySQL的应用
  • 团队对MySQL更熟悉,有成熟的MySQL运维经验
  • 需要丰富的生态和工具支持
  • 对成本敏感,需要便宜的云服务
  • 简单的CRUD应用,不需要复杂的数据库功能

选PostgreSQL的场景:

  • 需要复杂的查询和分析(数据仓库、BI、报表)
  • 需要存储和查询JSON、地理信息、时序数据、向量数据
  • 需要强大的全文搜索功能
  • 对SQL标准兼容性要求高
  • 需要自定义类型、函数、扩展
  • 科学计算、地理信息、AI应用等特定领域
  • 希望用一个数据库满足多种需求,减少技术栈复杂度

两者都可以的场景:

  • 一般的Web应用、移动应用后端
  • 中等规模的业务系统
  • 团队对两款数据库都不熟悉,需要学习成本低的

一些建议

如果你还在纠结,这里有一些建议。

第一,根据业务需求选。不要因为"PostgreSQL更先进"就盲目选PostgreSQL,也不要因为"MySQL用的人多"就盲目选MySQL。先想清楚你的业务需要什么功能、什么性能,再做选择。

第二,根据团队能力选。如果你的团队对MySQL很熟悉,有丰富的运维经验,那选MySQL就好。不要为了追新而引入不熟悉的技术,增加风险。

第三,考虑未来的扩展性。如果你的业务未来可能需要复杂查询、JSON、地理信息等功能,PostgreSQL可能是更好的选择,因为它的功能更全面,未来不需要换数据库。

第四,可以混合使用。不是说选了一个就不能用另一个。很多公司是MySQL做核心业务库,PostgreSQL做分析库或特定功能库。根据不同的需求,选择合适的数据库。

第五,不要过度设计。很多小项目,用MySQL和PostgreSQL都一样,性能和功能都足够。这时候选你最熟悉的那个就好,不要为了"技术先进性"而增加不必要的复杂度。

写在最后

PostgreSQL 17和MySQL 8.4 LTS,都是非常优秀的开源数据库。

PostgreSQL功能强大、标准兼容、扩展性好,适合复杂查询和特定领域;MySQL简单易用、生态成熟、高并发表现好,适合互联网应用和简单业务。

没有绝对的好坏,只有适合不适合。选型的时候,根据业务需求、团队能力、未来规划来综合考虑,选择最适合自己的那一个。

数据库选型不是一锤子买卖,选了之后也可以根据业务发展进行调整。但在选型的时候多花点时间思考,可以避免后期的很多麻烦。

希望这篇对比能给正在做数据库选型的朋友一些参考。如果你有什么问题或者不同的看法,欢迎交流。