简介
MySQL的口号是“世界上最流行的开源关系型数据库”,而PostgreSQL的Slogan则是“世界上最先进的开源关系型数据库”,一看这两位就是老冤家了。我认为这两个口号很好的反映出了两种产品的性质:PostgreSQL是功能丰富,一致性优先,高大上的严谨的学院派数据库;MySQL是功能粗陋,可用性优先,糙猛快的“工程派”数据库。
流行度本身是一种优势,越流行用户基数就越大,生态就越繁荣。用户基数大,再丑也能整容整出来。但一个东西流不流行往往并不取决于其质量,最流行的东西有时候还往往比较垃圾,Javascript语言就是最生动的例子。
MySQL的主要用户群体集中在互联网公司,互联网公司的特点是什么?业务场景糙、猛、快。糙说的是互联网公司不像传统行业(例如银行)那样在意数据的一致性(正确性),数据重要性不高,比起停止服务,数据丢乱错也可以容忍。猛快说的则是需求变化急促,业务场景通常是简单的CRUD,要求响应时间快,数据量也比较大。糙猛快的互联网公司和糙猛快的MySQL一拍即合。
MySQL的哲学我称之为:“好死不如赖活着”,以及“我死后哪管洪水滔天”。其“可用性”体现在各种“容错”上,例如临时草台班子菜鸡程序员写出了各种垃圾SQL,有时候即使写错了,也可以跑起来。一个最离谱的例子就是MySQL竟然允许部分成功的事务提交,违背了关系型数据库的基本约束:原子性与数据一致性。
没有原子性就没有一致性,这种数据库如果用来记账恐怕是一笔糊涂账,所以说什么“金融级MySQL”恐怕就是一个笑话。滑稽的是还有不少用户把这个称之为“特性”,说这体现了MySQL的包容性。
如果是互联网业务,注册个新用户丢个头像、丢个评论可能不是什么大事。所以不少互联网公司通常并不在乎这一点,数据那么多,丢几条错几条又算个什么呢?这就是典型的工程派,业务很可能明天就死掉了,哪管它粗制滥造。万一成功了,反正前人拉的屎总有后人来擦。
PostgreSQL严格的约束与语法可能对新人来说“不近人情”,例如,一批数据中如果有几条脏数据,MySQL可能会照单全收,而PG则会严格拒绝。尽管苟且妥协看上去很省事,但在其他地方埋下了雷:因为逻辑炸弹深夜加班排查擦屁股的工程师和不得不清洗脏数据而骂娘的数据分析师肯定对此有很多话想说。从长期来看,做正确的事最重要。
前景
传统行业之所以称为传统行业,就是因为它们已经走过了野蛮生长的阶段,有着成熟的业务模型与深厚的底蕴积淀。它们需要的是正确的结果,稳定的表现,丰富的功能,对数据进行分析加工提炼的能力。所以在传统行业中,往往是Oracle、SQL Server、PostgreSQL的天下。
互联网行业占据了有利的话语权高点,声音大传的远,所以各种培训班里总少不了MySQL的课程。但问题在于不少互联网公司自己已经一只脚迈入“传统行业”了,越来越多的互联网公司也开始脱离了糙猛快的低级循环,将目光投向了 PostgreSQL 。
MySQL最大的问题在于:它的生态位越来越狭窄。论严谨的事务处理与数据分析,PostgreSQL甩开它几条街。但论糙猛快,快速出原型,文档数据库MongoDB比MySQL更能担此大任。因此我们可以看到在DB-Engine中,排名第四的PostgreSQL与排名第五的MongoDB一前一后,呈现对MySQL的夹击之势。可以说,MySQL处在一种吃老本的位置上,凭藉巨大的存量维持着。但时间是站在PostgreSQL这一边的。
MySQL的另一个问题是职业发展问题,程序员学技能都是为了增强自己的竞争力。学好MySQL,可以成为一个合格的CRUD程序员。单纯干CRUD只是“数据矿工”,数据分析才是数据产业链上的暴利肥差。以MySQL孱弱的分析能力,很难支持码农转型发展。相比之下PostgreSQL则游刃有余,一招鲜吃遍天。人无我有,人有我优。MySQL能干的CRUD,Postgres现在干的比MySQL还要好。MySQL干不了的数据分析,地理行业空间数据查询分析,时序插件物化视图物联网分析,搜索引擎全文检索倒排索引,FDW对接各种外部数据源,Postgres一个数据库全都可以做。使用PostgreSQL的程序员,要多一条转型数据分析的道路。
最后最重要的问题,MySQL叫好不叫座。叫好是因为互联网公司声音大,用的多,喊得响亮。不叫座是因为互联网公司在软件上非常抠门,有开源的用是绝对不会用商业的。我们可以看到各种数据库厂商暗搓搓出品的“自研数据库”大体都是基于PgSQL改造的,卖PgSQL衍生版是一个很成熟的市场,传统企业不差钱且愿意付费买单。举个例子,HW基于PostgreSQL搞openGaussDB,就是一个很明智的选择。但卖MySQL卖给互联网公司?那就真是想多了。
与NewSQL相比
最近市场上当然也有一些很亮眼的NewSQL产品,例如TiDB,cockroachdb,yugabytesdb等等。何如?我认为它们是对开源软件行业的贡献,但可能同样面临叫好不叫座的困局。
这些NewSQL大体上主打“分布式”的概念,主要通过“分布式”,解决水平扩展性与容灾两个问题,同时因为分布式的内在局限性,将会牺牲许多功能。我接触过不少企业用户,绝大多数场景下的的数据量和负载水平完全落在单机Postgres的处理范围内(弄过十几TB的单库,几十万TPS的单集群)。牺牲功能换取扩展性很可能是一个伪需求,从数据量上来讲,绝大多数企业终其生命周期的数据量也超不过这个瓶颈;至于性能就更不重要了,过早优化是万恶之源,很多企业的DB性能余量足够让他们把所有业务逻辑用存储过程编写然后高高兴兴的跑在数据库里。
所以这些NewSQL要解决的问题往往是 互联网 企业才会面临的问题,然而互联网企业又极少为这些软件买单。这就面临和MySQL类似的问题。没有利益之油的浇灌,天才之火也难以持久。
弃暗投明?
很多老程序员已经和MySQL形成了深度利益绑定,天天嚷嚷着MySQL多好多好。触动利益比触动灵魂还难,人上了年纪就很难学新东西了,看到自己擅长的技术日落西山那肯定是愤懑不平。毕竟俺年纪一把,PostgreSQL再好,让我抛弃我心爱的小海豚,做不到啊。但年轻人还是有机会选择一条光明的道路。
时间是最公平的裁判,客观趋势不以个人意志为转移。 就我个人观察,在新兴的极有活力的Golang开发者群体中PostgreSQL的流行程度要显著高于MySQL(例如Instagram,TanTan,Apple都是Go+Pg)。这里的主要原因就是新生代开发者的崛起,Go之于Java,就像PgSQL之于MySQL。简单明了。
这其实就是演化的核心机制 ——新陈代谢。Go和PgSQL慢慢拍扁Java和MySQL,但Go和PgSQL当然也有Potential在以后被诸如Rust和某些newSQL数据库拍扁。但说到底,搞技术还是要搞那些前景光明的,不要去搞那些日薄西山的,(但也不适合太早去当烈士吃螃蟹)。要去看新生代开发者在用什么,有活力的创业公司、新项目、新团队在用什么,弄这些是没有错的。