最近帮一个正在做技术选型的朋友团队做了一次数据库评审,他们把PostgreSQL和MySQL来回对比了快一个月,最后发现纠结的全是错误的问题。类似的场景我这两年遇到太多次:数据库不是看跑分选出来的,而是看你的业务模型、开发团队、运维能力以及未来三年的增长曲线共同决定的。这篇就把我在企业数据库选型这件事上的判断逻辑完整写下来。
先说结论:PostgreSQL和MySQL这场持久战,本质上不是哪个数据库更厉害的问题,而是两种完全不同的设计哲学在服务不同的业务世界。MySQL用二十年把自己做成了Web应用和交易系统的"标准配件",PostgreSQL则一路打磨成了功能完整的"数据库瑞士军刀"。你需要的不是yao一个放之四海而皆准的答案,而是一套能结合自身场景判断的框架。
1. 二十年后两个数据库走向相反的方向:设计基因决定一切
选型者最容易犯的第一个错误,是把PostgreSQL和MySQL当成同一种东西的比较。诚然,两者都是开源关系型数据库,都支持SQL,都有MVCC,但如果追溯它们的设计起源,你会看到两条完全不同的进化路线。
1.1 MySQL的Web基因:先解决读写,再补事务
MySQL诞生于1995年,恰逢互联网萌芽期。它最初的设计目标非常朴素:让Web应用能高效地做大量简单读写。早期的默认存储引擎MyISAM甚至不支持事务,也不支持外键,整张表配上索引就能跑得飞快。后来随着业务复杂度提升,InnoDB被引入补上了事务能力和行级锁,MySQL才逐渐进入企业级市场。
这个"先跑起来再说"的基因直接影响了它的架构形态。MySQL采用插件式存储引擎架构,同一套SQL层可以对接InnoDB、MyISAM、Memory等不同引擎。这种设计给了DBA极大的灵活性,却也埋下了隐性的坑:很多功能性保证只在某个特定引擎下才成立。比如外键约束只有InnoDB支持,你换到别的引擎,表结构照建,但约束静默失效。再比如8.0.16版本之前的CHECK约束,语法上完全接受,但执行时根本不校验,等于形同虚设。这类"文档说自己支持,实则半残"的特性,在我做技术评审时经常遇得到,而且往往是业务出问题后才被发现。
MySQL的优势也恰恰来自这个基因。因为是围绕Web场景成长起来的,它在简单点查、高并发小事务、读写分离这些方面积累了大量实战调优经验。它的问题在于:当你的需求超出交易型CRUD的边界,进入复杂查询、多表关联、数据分析、地理空间等领域时,MySQL就显得吃力了。
1.2 PostgreSQL的学院派路线:先把功能做全
PostgreSQL的历史可以追溯到上世纪八十年代加州大学伯克利分校的Postgres研究项目。这个项目从诞生那天起就不是为了某个具体商业场景,而是为了探索关系数据库理论能做到什么程度。这种学院派出身决定了它的设计优先级:先把功能做对、做全,再来考虑性能和易用性。
于是我们看到PostgreSQL的很多特性是"跨时代"的:它在9.4版本就引入了JSONB,支持二进制格式的JSON存储和GIN索引;它从很早就有完整的窗口函数、CTE递归查询、物化视图;它原生了六种索引类型,支持部分索引、表达式索引;它的约束体系里除了常见的PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK,还有EXCLUDE排他约束,可以把"同一时间段不能有重叠预约"这种业务规则直接写进数据库。
这些能力意味着什么?意味着开发团队可以把更多业务逻辑下沉到数据库层,而不是在应用层用代码硬扛。举个例子,一个报表需求要算每个用户每个月份的前N条记录,在PostgreSQL里一个窗口函数加子查询就搞定,在MySQL里你得写存储过程或用多条SQL在应用层拼接。这不是"能不能实现"的问题,而是开发效率和查询性能的天壤之别。
如果给两者的选择画一条时间线,我倾向于这么看:如果你的业务是典型的电商交易、SaaS后台这种以简单增删改查为主的场景,MySQL是够用且性价比极高的选择;一旦你的业务里开始出现"复杂查询""统计分析""JSON混合存储""空间数据"这些字眼,PostgreSQL的能力释放会非常明显。
2. 查询优化器、索引和存储格式:性能差异的真正分水岭
很多人以为数据库性能差距主要靠硬件和参数调优,实际上SQL能不能跑得快,在语句提交的那一刻就由优化器决定了。这一章我想把两个数据库在内核层面的真实差距讲透。
2.1 优化器:PostgreSQL是成本估算专家,MySQL则倾向简单快速
数据库优化器的工作,是把一条SQL翻译成多个可选的执行计划,从中挑选代价最小的那个。这个"代价估算"的准确性直接决定了复杂查询是秒回还是拖到超时。
PostgreSQL的优化器是我见过最"较真"的。系统表里存着每个表的行数、每列的数据分布直方图、高频值、NULL值比例,还支持多列统计,也就是跨列的关联统计信息。规划时它会综合计算顺序扫描、索引扫描、嵌套循环、哈希连接、合并连接等各种路径的IO代价和CPU代价,选出最优计划。这种机制在数据量增长、数据分布发生变化之后,可以通过ANALYZE命令更新统计信息,让执行计划自适应调整。
MySQL的优化器在5.7及之前的版本里相对朴素,主要依赖索引选择性和表的统计信息做判断,复杂多表关联时选错执行计划的情况时有发生。MySQL 8.0加入了直方图功能,优化器能力有明显提升,但和PostgreSQL相比仍有差距,尤其是在多表关联超过五六张表、条件里带有复杂函数和子查询的混合负载场景下,我实测过不少次同样的SQL,PostgreSQL能找出合理的执行路径,MySQL则会走出一些让人看不懂的"歪路"。
这里想提醒一句:如果你只做简单点查和短事务,这个差距几乎感知不到,因为点查不需要复杂的计划生成。但当你开始写涉及七八张表的关联报表,或者在一个大表上做多条件组合筛选时,选错执行计划的后果会呈指数级放大。
2.2 索引体系:一棵B+树和六类索引的差距
索引是数据库性能的矛。MySQL的索引体系基本可以概括为"一棵B+树走天下",除了默认的B-Tree索引外,只有全文索引和有限的空间索引。PostgreSQL则提供了六类索引方法:B-Tree、Hash、GiST、SP-GiST、GIN、BRIN。
这六类索引对应了完全不同的查询场景。GIN索引是全文检索和JSONB查询的利器,它的倒排结构让"在百万级文档里按关键词过滤"这种需求从全表扫描变成索引快速定位。GiST索引是地理空间数据的标配,PostGIS就是建立在它之上,可以高效处理"某个坐标半径范围内的POI""两个多边形是否相交"这类空间计算。BRIN索引则是个被严重低估的冷门选手,它也译作块范围索引,适合物理上按顺序排列的大规模时序数据,比如按时间戳追加写入的监控指标表,BRIN索引的大小可能只有B-Tree的百分之一,但查询性能依然能保持在线。
举个现实的例子:我维护过一张每天新增数百万行的设备上报表,时间戳列是主键顺序,如果在这张表的设备ID和时间戳上建B-Tree复合索引,几十亿行数据会让索引占掉几百GB空间。换成BRIN之后索引体积只有几个GB,按时间范围的查询性能几乎持平。这种索引MySQL完全提供不了,遇到类似场景要么忍受巨大的存储浪费,要么引入额外的大数据组件。
2.3 堆表与聚簇表:MVCC实现带来的运维差别
MySQL InnoDB使用聚簇索引存储,表数据本身按主键顺序排列,二级索引的叶子节点存的是主键值,所以通过二级索引查询时需要二次回表。PostgreSQL则使用堆表存储,数据行物理上独立存放,所有索引的叶子节点都指向行地址,因此不存在"回表"的概念,代价是每次数据更新会留下旧的死元组(dead tuple),需要VACUUM机制定期清理。
这个底层差异直接体现在日常运维上。MySQL的InnoDB会通过undo log维护版本链,版本清理对DBA基本透明,不需要过多干预。PostgreSQL的autovacuum进程如果配置不当或者负载压力过大,表会逐渐膨胀,索引性能也会随之劣化。很多从MySQL迁到PostgreSQL的团队第一个不适应的点就在这里,他们会问"为什么我的表越来越大"。
好消息是PostgreSQL 14之后autovacuum的调度能力有了长足进步,日常使用基本不需要手动干预。但我的建议是:选PostgreSQL之前,运维同学一定要建立监控表膨胀的意识,把autovacuum相关参数、膨胀率监控、周期性的手动VACUUM策略纳入日常工作,这比什么参数调优都重要。
3. 数据完整性、高级特性和半结构化数据:容易被低估的开发效率差距
数据库选型往往只盯着性能和并发,却忽略了数据库是给开发团队用的开发工具这个事实。数据库本身的表达能力越强,开发团队需要写的业务代码就越少。这一章讲的就是这些"平时不起眼,用到才知道重要"的隐性差距。
3.1 约束与业务规则:MySQL历史债务埋下的雷
数据完整性是关系数据库的基本盘,但MySQL在这方面的历史包袱比很多人想象的重。
前面已经提到MySQL 8.0.16之前CHECK约束只解析不生效,这是个相当离谱的历史问题。我在帮客户排查数据异常时,确实遇到过因为对"年龄字段必须大于0"过于信任,结果写入了一批负数的垃圾数据。迁移到PostgreSQL后这个约束才真正执行。如果你现在还在MySQL 5.7上,强烈建议不要把CHECK约束当作保护数据的防线,只能用应用层校验补位。
外键的差异也很典型。MySQL支持外键,但很多DBA和开发者为了性能刻意不用,数据一致性完全靠应用代码保证。PostgreSQL的外键体系完善,而且由于它的MVCC和锁机制实现不同,在高并发场景下外键检查的性能损失比MySQL小得多。配合触发器(PostgreSQL的触发器支持行级和语句级、BEFORE和AFTER、INSTEAD OF,支持用PL/pgSQL写复杂逻辑),很多复杂的级联更新、审计日志需求都能在数据库内干净利落地完成。
还有一个MySQL完全没有、但业务中极其好用的东西:EXCLUDE排他约束。比如会议室预约系统要保证"同一会议室同一时间段不能被两个人预定",MySQL里你得写存储过程做重叠检查,或者锁表配合应用层判断,很容易出并发漏洞。PostgreSQL里直接在表上加一个USING gist的排他约束,数据库层面就能拒掉重叠插入,省心且绝对可靠。
3.2 窗口函数、CTE、物化视图:报表开发的真实体感
窗口函数和CTE是复杂查询的利器,这两个特性PostgreSQL从9.4就开始提供,MySQL直到8.0才补齐。差距不在于有没有,而在于生态里围绕这些能力沉淀的经验和第三方库。
我见过太多在MySQL上做报表的团队,为了算一个"每个用户最近三笔订单"的需求,只能先查全部数据到内存再用Java或Python二次处理。数据量小没问题,数据量一旦上来就成了性能灾难。PostgreSQL的窗口函数一行ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY created_at DESC)就能精准搞定,并且全部下推到存储引擎执行,效率和编码体验都是降维式的。
物化视图的区别更明显。PostgreSQL原生支持物化视图,数据自动刷新,复杂查询可以把开销很大的子查询提前固化成物理表,查询时直接读结果。MySQL直到今天都没有原生物化视图,要实现类似效果得手动建临时表加定时任务刷新,多了一大坨运维逻辑,还容易出数据不一致的问题。如果你有实时大屏、BI报表这类场景,物化视图的存在与否直接决定了上层架构的复杂度。
CTE递归查询也是一样。组织架构树、分类层级、供应链BOM这类树形结构数据,PostgreSQL一条WITH RECURSIVE语句就可以优雅地递归遍历并输出整棵子树,MySQL 8.0虽然也支持了,但是实现时日期函数、类型转换的差异会让你觉得处处别扭。强烈的体感差别就在这些细枝末节里。
3.3 JSONB与JSON:半结构化数据的关键选择
现在几乎没有业务是完全规整的关系型数据了。埋点日志、用户画像、商品扩展属性、配置中心,都在往JSON里塞。两个数据库都支持JSON,但支持的质量差距极大。
MySQL的JSON类型是从5.7开始引入的,能存储JSON文档,也支持JSON_EXTRACT这类函数做字段提取,整体表现是可用的,但谈不上顺手。比如你要在一张订单表里按JSON字段的内容做筛选,MySQL只能走函数索引,查询时往往需要先处理整个JSON再匹配条件。PostgreSQL的JSONB则是完全不同的东西,它以二进制格式存储JSON,解析开销低,支持GIN索引,还提供了一套非常顺手的高级操作符,比如@>可以判断"这个JSON是否包含另一个JSON结构",配合倒排索引能快速定位包含某个标签的所有记录。
更重要的是PostgreSQL的JSONB能实现"文档模型和关系模型混合使用"。你可以在一张表里既有严格规范的业务字段,又有灵活多变的扩展属性字段,需要严格约束的字段用关系列严格控制,需要快速迭代的字段放进JSONB,两者还能在一个SQL里自由组合查询。这种自由度在企业业务快速演进的阶段极其有用,MySQL很难做到这种程度。
如果让我给一个直观的建议:业务里JSON只是偶尔存一下、读取时原样取回,MySQL够用;JSON会参与检索、聚合、按属性过滤,或者希望数据库帮你在半结构化字段上建立索引做高性能查询,果断选PostgreSQL。
4. 高可用、备份和运维成本:选型后最难翻盘的部分
功能再好、性能再强,数据库第一位的永远是稳定运行。高可用架构和运维体系的成熟度,是选型时最不应该被忽略的部分,因为一旦业务跑起来,这部分几乎不可能推倒重来。
4.1 MySQL的生态护城河:binlog和各种中间件
MySQL在运维生态上的优势是不能否认的。它的binlog机制从很早版本就非常稳定,基于binlog的复制、增量备份、数据订阅工具链极其丰富。主从复制、半同步复制、组复制(MGR)、MHA、Orchestrator,再加上各种Proxy中间件如ProxySQL、MaxScale,你能想到的高可用格局几乎都有成熟方案。
云厂商对MySQL的拥抱程度也远超PostgreSQL。阿里云、腾讯云、华为云上RDS MySQL都是绝对主力,规格从0.5核1GB到几百核的大实例,从单节点到一主多从,都做得非常成熟。很多中小团队甚至不需要自己搭高可用,直接买个云RDS就完事,备份、监控、自动切换、版本升级全都是服务商管好。这道护城河在决策时的分量非常重——它意味着极低的选择成本和运维成本。
如果你的团队规模不大、没有专职DBA,又不想为基础设施耗费太多精力,MySQL依然是那个"安全牌"。云的便利性和生态的成熟度,足够抵消它在功能上的局限。
4.2 PostgreSQL的自建高可用:流复制、Patroni和版本升级
PostgreSQL的高可用体系同样成熟,但需要更强的运维能力来搭建和维护。物理流复制(Streaming Replication)加上Patroni是目前的事实标准,配合etcd或Consul做分布式一致性协调,可以实现主库故障后的自动切换。很多中型互联网公司就是用这套方案支撑核心业务,稳定性完全经得起考验。
PostgreSQL的逻辑复制也在10版本之后变得非常好用,它支持按表粒度、按数据库粒度进行数据分发,还能实现双向同步和跨版本数据迁移,在数据治理、数据上云、读写分离这些场景中应用非常灵活。热搜词里"postgresql高可用patroni安装"一直是个高频词,侧面说明自建PG高可用虽然成熟,但配套设施需要亲自动手组装,比MySQL开箱即用的route要复杂。
另外一个容易被忽略的点是大版本升级。PostgreSQL每次大版本升级都需要停库做pg_upgrade或者逻辑导出导入,虽然有工具能辅助,但相比MySQL的原地平滑升级,操作复杂度高不少。如果团队没有受过一定训练的DBA,可能会在大版本升级窗口里折腾得比较狼狈。
4.3 备份恢复和工具链的真实体验对比
备份恢复这块,两个数据库都提供了完整的逻辑备份和物理备份方案。MySQL的逻辑备份用mysqldump,物理备份识别用Percona XtraBackup,再加上binlog做增量,这套链路非常成熟。PostgreSQL的逻辑备份用pg_dump和pg_restore,物理备份用pg_basebackup,配合WAL归档可以做到任意时间点恢复(PITR)。
我个人的实操体验是:PostgreSQL的备份工具在一致性和恢复细节上做得更严谨。比如pg_dump默认导出的是事务性一致快照,整个备份过程不会因为并发写入产生"中间状态"数据,恢复出来的数据天然满足一致性。MySQL的mysqldump需要加--single-transaction参数才能保证一致性,否则在备份过程中有写入时可能会得到一份"脏快照"。遇到过大表备份时mysqldump把InnoDB缓冲池冲垮导致线上查询变慢的同学,应该能懂这种痛。
工具链方面,两者都有很好的图形化工具。Navicat、DBeaver、DataGrip都同时支持两者,日常开发体验差异不大。但如果涉及监控,PostgreSQL的pg_stat_statements、pg_stat_activity这些系统视图信息非常丰富,配合pgbouncer做连接池,能监控到的东西远远多于MySQL。运维体系真正成熟的团队,其实更喜欢PostgreSQL的这些可观测性能力。
5. 一次真实的MySQL到PostgreSQL迁移:踩坑清单和复盘
讲完两者的差异,我想分享一个真实项目案例。前年我参与了一个从MySQL迁移到PostgreSQL的完整过程,从评估到切换用了一个半月,中间踩了不少坑,这些经验应该对正在犹豫的人有直接帮助。
5.1 项目背景和为什么决定迁移
这是一个千万级用户的SaaS平台,原架构是MySQL 5.7一主两从。业务早期以简单交易为主,MySQL完全够用。后来产品线扩张,加入了多维度报表、标签筛选、地理围栏、JSON配置管理等功能,MySQL开始频繁出现慢查询,优化SQ L、加索引都只是缓解,治标不治本。团队评估后决定迁移到PostgreSQL 15。
促使迁移的原因有三条:一是报表类SQL在PostgreSQL上可以大幅简化,利用窗口函数和物化视图,查询性能从几十秒降到秒级;二是PostGIS的空间能力可以把原来依赖第三方地理位置服务的功能收编到数据库内;三是JSONB能统一管理快速变化的扩展字段,不再频繁ALTER TABLE加列。
5.2 兼容性坑:从反引号到隐式类型转换
迁移最大的成本不在数据搬迁,而在应用层SQL兼容性的改造。我把踩过的坑按出现频率列一下。
第一类是标识符和语法差异。MySQL用反引号包裹表名和列名,PostgreSQL用双引号;MySQL的LIMIT a,b是"从a开始取b条",PostgreSQL必须写成LIMIT b OFFSET a;MySQL的字符串用单引号和双引号都行,但PostgreSQL里双引号只用于标识符,字符串必须用单引号。这些差异导致所有SQL语句都得过一遍语法改造。
第二类是隐式类型转换。MySQL的隐式类型转换非常宽松,比如字符串列和数字比较时会把字符串转成数字再比较,甚至不会报错。PostgreSQL的类型系统极其严格,"user_id='" + userId + "'"这种MySQL中能跑通的拼接查询,在PostgreSQL里会直接报错"column type is integer but expression is varchar",逼着你规范写法。这听起来是麻烦,实际上帮团队消灭了一大批潜在的脏数据来源。
第三类是函数名不兼容。DATE_FORMAT函数在PostgreSQL里要改成to_char;IFNULL要改成COALESCE;DATE_SUB和DATE_ADD要改成日期加减操作符加interval表达式。这些函数在业务SQL里满天飞,一开始改造工作量巨大,我建议提前写一个转换映射表,团队按映射表统一处理,能省下大量反复确认的时间。
第四类是事务性DDL的差异,这一点容易被忽略。MySQL的DDL语句会隐式提交当前事务,所以"ALTER TABLE先加列再回滚"在MySQL里是不可能的,事务里的DDL一旦执行就不可逆。PostgreSQL的DDL完全事务化,可以BEGIN; ALTER TABLE...; ROLLBACK;整体回滚。这意味着迁移后运维操作的安全性大幅提升,但应用层的重试逻辑也要做相应调整。
第五类是大小写敏感性问题。MySQL在Linux下默认表名区分大小写,列名不区分;PostgreSQL则完全区分大小写,且未加引号的标识符会被自动折叠成小写。如果业务代码里用驼峰命名列并在SQL里带引号查询,迁到PostgreSQL后必须严格对应大小写,否则找不到列。
5.3 迁移步骤和工具建议:不要幻想一条命令搞定
数据迁移工具方面,pgloader是目前MySQL到PostgreSQL最常用的开源工具,支持表结构、数据、索引、外键的自动转换,嘎嘎地把MySQL的AUTO_INCREMENT转成PostgreSQL的SERIAL,把TINYINT(1)转成BOOLEAN等等。但即便有pgloader,我也强烈建议不要拿生产环境直接跑。
我的建议步骤如下:先在测试环境做预迁移,导出MySQL结构后人工审查和调整DDL,特别是索引命名和check约束的兼容性;数据迁移建议分批进行,避免一次大事务压垮源库和目标库,每批几百万行提交一次;业务切换前做双跑验证,也就是同一时段同时写两套库,对比数据一致性;最后流量切换时预留回退窗口,出问题能快速切回MySQL。
还有一个细节容易被忽略:迁移后PostgreSQL需要重新执行ANALYZE生成统计信息,否则优化器对空表和新数据分布没有感知,第一条生产查询就可能选错执行计划,慢到让人怀疑迁移的决定。跑完数据立刻ANALYZE,这步一定不能省。
6. 梳理一套选型决策框架:别再用"性能好"这种理由做决定
最后这一章,我给出一套实际可用的决策框架。与其在"哪个更快"上争论不休,不如按下面的维度过一个回环,答案会自己浮现出来。
6.1 先回答自己四个问题
第一个问题:你们的查询到底有多复杂。如果核心业务就是用户表、订单表、商品表的简单增删改查加单表分页,MySQL就是最称手的工具。如果业务里已经出现多表关联报表、排行榜、留存分析、漏斗分析、树形结构递归、空间坐标计算这些词汇,PostgreSQL的开发效率和运行效率高出不止一个量级。
第二个问题:数据库需要承担多少"业务规则"。数据校验、唯一性约束、排他约束、触发器、物化视图这些能力,MySQL其实都有,但很多是"半残"的,需要用应用层代码补偿。PostgreSQL则能把这些规则原原本本写进数据库。如果你们公司的应用层代码里已经有大量用于保证数据一致的补偿逻辑,那么是时候考虑把这些逻辑下沉到PostgreSQL里了。
第三个问题:团队的SQL功底和运维能力。一个熟悉MySQL的团队迁到PostgreSQL,学习成本大概在两到四周,代价不算大。但如果是零DBA团队、运维全靠云厂商,MySQL的云生态能省出大量时间。PostgreSQL自建高可用和监控体系需要更多动手能力,但一旦搭建完成,日常维护并不比MySQL复杂。
第四个问题:未来三到五年的数据规划。如果你们计划在PostgreSQL生态里引入PostGIS做空间计算,或者用TimescaleDB承接时序数据,或者希望在JSONB上做快速的扩展属性检索——这些方向都是PostgreSQL的舒适区,MySQL很难给到同等的体验。
6.2 决策对照表:把选择变成打分题
我习惯用一张表给刚接触数据库选型的朋友看,可以对照打出自己的分:
| 维度 | MySQL占优的情况 | PostgreSQL占优的情况 |
|---|---|---|
| 核心场景 | 在线交易、简单CRUD、Web应用 | 复杂查询、报表分析、GIS、半结构化数据 |
| 生态运维 | 云RDS成熟、中间件多、招聘容易 | 功能自洽、可观测性强、逻辑复制灵活 |
| 数据完整性 | 约束体系有历史坑,需应用层补 | 约束完善,支持排他约束、事务性DDL |
| 高级特性 | 窗口函数/CTE在8.0后补齐,但底子薄 | 物化视图、BRIN/GIN索引、JSONB是原生能力 |
| 团队适配 | MySQL技术栈存量巨大,上手快 | 需要一定的SQL进阶能力和DBA意识 |
| 长期方向 | 适合业务稳定、快速交付的团队 | 适合想沉淀数据能力、做领域建模的团队 |
6.3 我最后的建议:用两个"如果"收束
如果你们的业务本质是交易型系统、核心诉求是稳定和简单、团队又是MySQL长大的,没必要为了技术新鲜感去迁PostgreSQL。如果你们的业务已经从"记录发生了什么"进化到"分析为什么发生、预测将要发生什么",那PostgreSQL的回报会非常可观。
选型不是选一个"更好的数据库",而是选一个"更适合你们现阶段业务形态和团队能力的数据库"。我见过团队为了一股脑的热血从MySQL迁到PostgreSQL,最后因为SQL改造量大、团队不熟悉而叫苦不迭;也见过PostgreSQL带来的分析能力升级,把整个数据驱动决策的流程做活。两者没有绝对的优劣,但确实有更适合自己的场景。
如果条件允许,我建议两条腿走路:新项目直接在PostgreSQL上起步,存量MySQL业务继续服务好现有场景。等团队真正在PostgreSQL上积累了手感,再评估是否需要做存量迁移。毕竟技术在变,业务在变,数据库选型本来就不是一次性的决定,而是一个可以持续修正的路线问题。