用了十几年的 MySQL 了,突然发现 PostgreSQL 可能更加适合我,大家怎么看? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Rooger
V2EX    PostgreSQL

用了十几年的 MySQL 了,突然发现 PostgreSQL 可能更加适合我,大家怎么看?

  •  
  •   Rooger 1 小时 58 分钟前 774 次点击

    从 13 年毕业开始就开始使用 MySQL ,当时不理解 DBA 把用户表分成了 100 张,后来在别人的一通解释下也渐渐理解了。

    17 年自己开始作为主程负责一个新项目,当时因为把用户表分成 100 张还跟老板吵过架(因为当时另外一个项目的负责人本身就是个混混,还给老板一通乱说,弄的我特别郁闷,无自己当时的心理素质不是特别强大)。后来我也觉得 100 张表可能太多了,可能没有那么多用户,索性就只分了十张。

    20 年新的项目,开始尝试使用 MongoDB ,经别人推荐,说 MongoDB 怎么适合游戏。当时觉得这东西好啊,但是在实际使用时,并不是那么美好。

    24 年另外一个项目,负责人全部使用了 MongoDB ,但是用法相当暴力,也就是每次全量存储用户的数量到 MongoDB 中,感觉跟使用 MySQL 也没有什么实质性的区别。

    今年负责另外一个项目时,最开始设计者将用户的 JSON 数据先进行 base64 encode ,然后异或加密存储到了 MySQL 中。因为最开始的客户端的设计是纯单机,后面加了服务器存储用户的存档而已。

    新的需求是要将这个单机版本做成一个联网版本,因为我之前有将单机变成联网的成功经验(某合成游戏变成联网版本,国内流水过五亿)。

    现在的存储结构没有规划过,JSON 结构下面有超过 200 个字段,活动配置占用超过了 90% 的存储以上,平均用户的存储占用在 100KB 以上。 存档中存储活动配置的原因:活动开启之后,则配置不再发生变化。

    我重新设计了存储结构,使用 Protobuf 重新设计了数据存储,将活动配置数据跟游戏存档分离。活动配置单独存档在一张配置表,用户的存储中只记录对应的唯一 ID 。同时提供了接口,可能将旧的数据转换为新的 Protobuf 存储结构。

    用户的数据存储中,使用 JSON 存储,存储的内容为 Protobuf 对应的 JSON 数据。用户更新数据时,提供了 FieldMask 仅修改部分数据(只前每次都是全量更新)。

    当这个版本成功上线之后,我发现某些接口调用比较慢,例如在用户转换存档时,我将客户端提供的原始数据、转换之后的结果存储到了 conversion_logs 配置表(数据类型均为 JSON ),内网的虚拟机上平均耗时为 200ms 。因为最近在研究 PostgreSQL ,索性就试了一下性能对比,结果 PG 只需要 20ms 左右。最关键的是,表空间存储的占用上,PG 远低于 MySQL ,因为 PG 存储使用的类型为 JSONB 。

    我尝试对比纯 TEXT 字段的记录时,PG 占用的空间也只有 MySQL 的 1/3 ,现在的数据表现就是在存储和插入速度 MySQL 远低于 PG 。更新的速度还没有完全验证。

    SELECT table_name, ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb, ROUND(data_length / 1024 / 1024, 2) AS data_mb, ROUND(index_length / 1024 / 1024, 2) AS index_mb FROM information_schema.tables WHERE table_schema = 'merge_island' AND table_name IN ('conversion_logs','game_saves','activity_saves','activity_config'); +-----------------+----------+---------+----------+ | TABLE_NAME | total_mb | data_mb | index_mb | +-----------------+----------+---------+----------+ | activity_config | 216.83 | 209.55 | 7.28 | | activity_saves | 0.16 | 0.16 | 0.00 | | conversion_logs | 70.55 | 70.52 | 0.03 | | game_saves | 7.48 | 7.39 | 0.09 | +-----------------+----------+---------+----------+ 
    SELECT relname AS table_name, pg_size_pretty(pg_total_relation_size(relid)) AS total_size FROM pg_catalog.pg_statio_user_tables WHERE relname IN ('conversion_logs','game_saves','activity_saves','activity_config'); table_name | total_size -----------------+------------ activity_config | 32 MB activity_saves | 376 kB conversion_logs | 13 MB game_saves | 1976 kB 

    另外把用户分为 100 张的操作在 PG 这里完全是反模式的,因为 PG 号称单表轻松过亿。另外十多年前的老设计本应该也要被淘汰了,毕竟现在都是云服务,空间存储可以轻松扩充,不用再担心这个问题。

    有没有使用 PG 淘汰 MySQL 的大佬来分享一下自己的经历,一起学习哈。

    13 条回复    2025-12-27 12:49:43 +08:00
    idihs
        1
    idihs  
       1 小时 51 分钟前
    用乔布斯的话来说,应该是我们有一个牛逼的需求,让我们去选一个技术去实现吧;而不是我有一个牛逼的技术让我们去做点什么吧。(`)
    Georgedoe
        2
    Georgedoe  
       1 小时 49 分钟前
    PG 支持的场景更多,如果想用一个数据库干所有事的话那确实 PG 更合适
    xuld
        3
    xuld  
       1 小时 42 分钟前
    我一直认为,PgSql 在各方面都要优于 MySql 。而 MySql 只有一个优势:发布更早(因此存量用户更多)。
    但现在仍有很多新老项目在使用 MySql ,主要原因不是因为 MySql 更优秀,而是:
    1. 虽然 PgSql 在很多地方优于 MySql ,但 MySql“也不是不能用”,没有决定性的放弃 MySql 的理由。
    2. 大部分程序员只会按习惯工作,拒绝接受新技术,对新技术有未知的恐慌感,他们只接触过 MySql ,让他们放弃 MySql 会有莫名的不安。
    3. 老项目如果 MySql 跑的好好的,不存在理由去升级它,毕竟大家都是打工心态,多一事不如少一事。
    4. PgSql 服务器成本目前略高于 MySql 服务器。
    stinkytofux
        4
    stinkytofux  
       1 小时 33 分钟前
    看来我也需要尝试一下 PgSql 了, 正如楼上所说, MySql 不是不能用, 没有那么多牛逼的项目要做.
    BeijingBaby
        5
    BeijigBaby  
       1 小时 26 分钟前   1
    mysql 从管理上来讲更熟就应该继续用 mysql ,
    pgsql 如果你没有多年的管理经验,后续可能还有很长的坑要踩哦。。。
    frankilla
        6
    frankilla  
       1 小时 19 分钟前
    作为一个门外汉,pgsql 部署简单很多,以前光看数据库部署教程都麻了,别更说真去部署。
    ratazzi
        7
    ratazzi  
       1 小时 17 分钟前 via iPhone
    不说别的,PG 有几个特性我觉得非常实用省心
    1. varchar 不强制长度限制,不会出现错误长度估算导致数据被截取之类的问题
    2. partial index 可以轻松实现 软删、取消等场景不唯一 但非软删、有效状态的唯一限制,这种事情代码和人真靠不住
    chqome
        8
    chqome  
       1 小时 15 分钟前
    公司以前用的 oracle ,后来全面转向 PostgreSQL 了
    vopsoft
        9
    vopsoft  
       1 小时 15 分钟前 via Android
    MySQL 5.7 后就支持 JSON 了
    PG 不是很了解,例如它的集群 HA 是怎么弄的?
    everhythm
        10
    everhythm  
       1 小时 14 分钟前
    pg 是啥啥都能干,nosql jsonb ,时序数据库,向量数据库,虽然不是各个领域最好的,但是作为业务起步完全没问题

    pg 的底层设计也是领先 mysql 的,叠加国产信创,后面用 pg 的会越来越多
    bootvue
        11
    bootvue  
       46 分钟前
    pg 某些方面性能确实好 但是没好到碾压 mysql 的地步 真到了很大规模的业务量 业务侧 数据库选型 多种数据库组合用要综合考虑
    midsolo
        12
    midsolo  
       35 分钟前
    刚参加工作时,在某快递厂,项目使用 Mycat 进行分库分表,24 个库每个库 16 张表,一个 MHA 管理着 24 套 MySQL 主从。

    8 年过去了,现在项目用 Sharding-JDBC 进行的分库分表,8 个库每个库 64 张表,买了一堆的 Amazon RDS MySQL 。
    dzdh
        13
    dzdh  
       3 分钟前
    @vopsoft
    mysql 的 json 的 crud 仅仅实现了 R 吧。跟 PG 比就真的是萤火比之皓月,水分子比之江洋

    PG 的 HA 最新版本仍然是主从,然后通过逻辑复制订阅槽进行同步

    方案很多,比如 citusdb ,可以做 shard nothing. 社区版最近已经支持 rebalance 了。

    timescaledb 做时序检索

    pgroonga unicode 的全文检索

    pgvector 做 RAG 知识库

    pgstorm GPU 加速

    postgis GIS 的事实开源标准


    插件生态极其强大
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2497 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 04:53 PVG 12:53 LAX 20:53 JFK 23:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86