MySQL 没落了?说这话的人可能没写过生产代码
最近几年有个说法越来越流行:“PostgreSQL 全面碾压 MySQL,MySQL 没落了,新人直接学 PostgreSQL 就好。”
作为一个两种数据库都在生产环境用过的人,我想说:这个判断既对也不对——对在 PostgreSQL 确实在很多方面更强了,错在"MySQL 没落"这个结论完全不成立。
MySQL 为什么被唱衰
客观说,PostgreSQL 这几年的进步确实大。它在几个关键点上超过了 MySQL:
JSON 支持。 PostgreSQL 的 JSONB 类型支持索引、支持路径查询操作符、性能比 MySQL 的 JSON 类型强不少。如果你做的是半结构化数据存储,PG 的优势确实明显。
全文搜索。 PostgreSQL 内置的 tsvector 和 tsquery 能做中文分词、相关性排序——不用像 MySQL 那样还得接 Elasticsearch。
地理空间数据。 PostGIS 扩展是行业标准。MySQL 8.0 虽然也加了空间索引,但跟 PostGIS 比差距还很大。
高级 SQL 特性。 窗口函数、CTE(WITH 递归查询)、LATERAL JOIN、物化视图——PostgreSQL 在这些上比 MySQL 领先不少。
扩展性。 PostgreSQL 支持自定义数据类型、自定义函数语言(PL/pgSQL、PL/Python、PL/V8)、自定义索引方法。MySQL 的插件体系没这么灵活。
许可证。 PostgreSQL 用 PostgreSQL License(类似 MIT),MySQL 在 Oracle 手里,虽然 GPL 但也有人不放心。
这些加起来,确实给了人"PostgreSQL 更强"的印象。
但 MySQL 远没到"没落"的地步
说几个数据:
- 根据 Stack Overflow 2024 开发者调查,MySQL 仍然是使用率最高的数据库(45%),PostgreSQL 紧随其后(41%),差距很小。
- DB-Engines 排名里 MySQL 长期第二,PostgreSQL 第四(前三名是 Oracle、MySQL、SQL Server,PG 在追但还没超)。
- 阿里云的 RDS 服务里 MySQL 实例数量远超 PostgreSQL。国内生态尤其如此——你去面试后端开发,要求 MySQL 的岗位数量远多于要求 PostgreSQL 的。
MySQL 没落了吗?用的人还是最多的。那为什么有"MySQL 没落"的感觉?
因为它从一个"遥遥领先的唯一选择"变成了"跟 PostgreSQL 并驾齐驱的两个选择之一"。从独占变成共享——这让习惯了"MySQL 就是数据库代名词"的人产生了落差感。
MySQL 仍然占优的场景
1. 简单 CRUD 应用。 如果你的应用就是增删改查,不需要 JSON 查询、不需要全文搜索、不需要复杂的地理计算——MySQL 完全够用,而且比 PostgreSQL 更容易上手。
2. 国内互联网公司。 这不是技术问题,是生态问题。国内 90% 的后端教程用的是 MySQL,90% 的开源 CMS(WordPress、Typecho、Halo)默认支持 MySQL,大部分 PHP/Laravel/ThinkPHP 项目跑在 MySQL 上。你学 PostgreSQL,结果接手的项目全用 MySQL——这就尴尬了。
3. 读多写少的场景。 MySQL 的 InnoDB 引擎经过十几年优化,纯读场景的性能非常稳定。加上成熟的读写分离方案(主从复制、MHA、Orchestrator),搭建高可用的 MySQL 集群有非常成熟的方案。
4. 运维生态。 MySQL 的监控工具、备份工具、迁移工具、慢查询分析工具——成熟度比 PostgreSQL 高。Percona Toolkit、pt-query-digest、gh-ost 这些工具在 MySQL 生态里用了十几年了,PG 的替代品还差点火候。
5. "够用就行"的团队。 如果你团队里没有人深入了解 PG 的高级特性,强上 PostgreSQL 反而会带来学习成本和运维风险。一个团队能把 MySQL 用好,比一个团队勉强用 PostgreSQL 强。
什么时候该选 PostgreSQL
如果你的项目符合以下任一特征,PG 确实比 MySQL 更合适:
- 需要复杂的 JSON 查询和 JSON 索引——PG 的 JSONB 一骑绝尘
- 需要做地理空间计算——PostGIS 是唯一选择
- 数据分析型的查询多——PG 的并行查询、物化视图、窗口函数比 MySQL 成熟
- 需要严格的数据一致性——PG 的 ACID 实现比 MySQL 更完整(MVCC 机制更干净)
- 你想用"一门语言写所有数据库逻辑"——PG 支持 PL/Python、PL/V8、PL/R
- 你是一家美国/欧洲公司——那边 PG 生态更成熟
那到底该学哪一个
我的建议很直接:
如果你是初学者,先学 MySQL。
理由很简单:MySQL 的岗位更多,教程更多,入门更快。你学了 MySQL,面试 90% 的后端岗位你都能应对。等你工作一两年,遇到 MySQL 搞不定的场景了——比如要做地理空间查询、要做复杂的数据分析——再学 PostgreSQL 是自然而然的事。
MySQL 到 PostgreSQL 的切换不难。SQL 标准是相通的,你只要习惯 pg_dump 替代 mysqldump、SERIAL 替代 AUTO_INCREMENT、COPY 替代 LOAD DATA。一两周就能过渡。
反过来,如果你先学 PostgreSQL,找工作时发现大部分公司要求 MySQL——这个成本就大了。
如果你有工作经验了,两个都学。
这不是废话。到了一定水平,数据库对你来说就是工具,不是信仰。你会根据项目需求选数据库,而不是根据"我只会这个"来选。
我现在做项目的心态是:
- 简单 Web 应用、快速原型 —— MySQL,省事
- 需要复杂查询、数据分析功能 —— PostgreSQL
- 缓存、会话、队列 —— Valkey(取代 Redis)
- 搜索引擎 —— Elasticsearch 或 Meilisearch
- 分析型查询 —— ClickHouse
每个工具都有它最适合的位置。
最后
"MySQL 没落了"是一个被夸大了的说法。更准确的描述是:MySQL 从唯一的主流选择,变成了两个主流选择之一。
这对我们是好事——多了选择,倒逼两个数据库都变得更好。PostgreSQL 10 的很多特性是被 MySQL 8.0 的竞争逼出来的,MySQL 8.0 的窗口函数和 CTE 也是被 PG 逼出来的。
所以别纠结"要不要放弃 MySQL"。不存在放弃——你只是多了一个选项。先学会 MySQL,再用 PG 扩展你的能力边界。这个顺序不会错。