为什么我们最终选了 PostgreSQL,而不是 MySQL
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
说出来可能被喷——我们团队在 2023 年做了一个让所有人意外的决策:新系统不用 MySQL,用 PostgreSQL。 这事在技术评审会上吵了整整两轮。DBA 说"MySQL 我们熟",架构师说"PostgreSQL 的 JSONB 真的适合我们的场景",我在白板上画了三个 Venn 图,最后 CTO 拍板:先在一个子系统上试,跑半年再说。 半年后,那个子系统成了我们整个公司查询性能最好的服务。然后又过了半年,我们开始把更多新系统往 PostgreSQL 上迁移。 整个过程没有"MySQL 不好"的结论,只有"我们的场景更适合 PostgreSQL"的决策。把这个过程写下来,供你们选型时参考。 1. 背景:我们是什么场景先说清楚我们的业务场景,因为技术选型从来没有"最好",只有"最适合"。 我们是做 B 端 SaaS 的,核心数据模型有几个特点:
MySQL 当然能搞定这些场景,我们旧系统就是用 MySQL 5.7 跑的。但踩了一些坑之后,我们开始认真考虑 PostgreSQL。 2. 第一个原因:JSONB 改变了我们的数据建模方式这是最直接的原因。 我们的 可以建虚拟列 + 索引,但每次 ext_info 的结构变了都要改表,对 SaaS 多租户场景来说维护成本很高。 PostgreSQL 的 JSONB 是真正为查询优化的: GIN 索引的酷炫之处在于:不管你在 JSONB 里怎么嵌套,只要 但这不是免费午餐。 JSONB 的写入性能比普通列慢,因为 GIN 索引的维护成本比较高。好在我们的场景是"读多写少",这个权衡完全可以接受。 3. 第二个原因:CTE 和窗口函数让复杂查询不再痛苦B 端系统经常有这种需求:“查出每个客户最近 30 天内的前 5 笔订单,按金额排序”。 MySQL 8.0 虽然支持了窗口函数,但用起来还是很啰嗦,而且性能……不太好: PostgreSQL 的 CTE(公用表表达式)支持 但这不是 PostgreSQL 单方面碾压。 MySQL 8.0 的窗口函数已经够用了,而且 MySQL 的优化器在简单查询(点到点)上其实更快。如果你的场景是"简单查询为主",MySQL 反而更合适。 4. 第三个原因:MVCC 的实现差异这是比较底层的原因,但影响了我们的运维体验。 MySQL(InnoDB)的 MVCC 实现依赖 PostgreSQL 的 MVCC 实现不同,它靠 但这里有个大坑: PostgreSQL 的 5. 第四个原因:扩展生态,但不是你想的那样很多人说"PostgreSQL 扩展多,MySQL 没有"。这个说法有点偏颇,但确实有些扩展是 PostgreSQL 独有的。 我们用了两个:
但反过来说,MySQL 的生态更成熟。 如果你要用到云厂商的托管服务,MySQL 的支持度(备份、恢复、监控、扩容)还是比 PostgreSQL 好不少的。我们用的是自建机房,这个问题不突出,但上云的话需要慎重。 6. 第五个原因:我们团队有人踩过 PostgreSQL 的坑这是最实在的原因。 我们团队有个 Senior 之前在上一家公司用过 3 年 PostgreSQL,他知道:
团队里有"踩过坑的人",这才是技术选型最重要的因素之一。 如果团队里没人懂 PostgreSQL,出了问题只能 Google,那选型的风险就太大了。 7. 我们的做法没有"一刀切"的结论。我们的情况是:
实际上,我们现在的架构是 MySQL + PostgreSQL 并存的。 新系统默认用 PostgreSQL,老系统继续用 MySQL,两者之间靠应用层做数据同步(用 Debezium 抓 MySQL binlog 同步到 PostgreSQL,反过来用 pglogical)。 这个架构运行了快两年,出过问题吗?出过。PostgreSQL 的主从复制曾经因为网络抖动导致从库落后主库 30 秒,我们的读负载均衡没做好兜底,导致用户看到了旧数据。 但总体来说,这个决策我们没有后悔。 8. 选型建议如果你也在纠结 MySQL vs PostgreSQL,问自己这几个问题:
没有最好的数据库,只有最适合你场景的数据库。 我们放弃了"统一技术栈"的执念,根据实际场景选工具,这事到现在看来是对的。 阅读原文:https://mp.weixin.qq.com/s/FfzvWIdwyHp68SqsFPcgzw 该文章在 2026/6/12 10:50:37 编辑过 |
关键字查询
相关文章
正在查询... |