百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

为何在国内MySQL成为主流,PG只能屈居二线?

ccwgpt 2025-03-01 13:10 44 浏览 0 评论

最近,小编在知乎上看到这样一个问题:


PostgreSQL也很强大,为何在中国大陆MySQL成为主流,PostgreSQL屈居二线呢?


PostgreSQL能否替代MySQL?我感觉PostgreSQL非常强大,很多地方超过了MySQL。


举几个例子:

1.丰富的数据类,支持数组、字典、json、序列号

2.强大的审计函数

3.强大的索引,易于sql调优


PostgreSQL在许多地方,有MySQL无法比拟的优势。但是在中国大陆,许多公司的核心业务库,都是MySQL,PostgreSQL则屈居二线,作为审计类的数据库来使用。


为什么不让PostgreSQL来扛大梁呢,而要用MySQL,PostgreSQL不合适么?


MySQL和PostgreSQL在功能上各有千秋,为什么没能在业界中形成“平分天下”的局面呢?小编精选了几位知乎网友的精彩回答,分享给大家学习交流(仁者见仁,智者见智,勿引战~):


1号知乎网友:大宽宽


以下均为个人感觉,没做过统计,就当个参考吧。


MySQL和Postgres的早期完全是两个极端。MySQL更像是个“基本上满足关系数据库语法的大号KV”,对关系型数据库的高级功能支持得很不好。我入行时接触的MySQL 5.1和MyISAM存储引擎,不支持ACID,但有如下几点在当时的互联网公司看来是非常合适:


1. 互联网公司为了扩展,长期的经验是,仅仅把数据库当作是一个“存储”,而非存储+核心数据逻辑的计算节点。大量的计算都在业务服务器上进行,而业务服务器可以无限水平扩展,无需担心有状态的数据迁移问题;


2. 因为没有提供很多高级功能和数据一致性的保障,MySQL对于简单的sql支持的反而更加直接,在速度上有很大的优势


3. 对于OLTP,完全不需要复杂的数据处理功能。简单的select ... from ... where id = xxx; insert into xxx;update xxx set xxx=xxx where id = xxxx是OLTP的主流功能。基于这些功能的ORM的出现大大提高了生产效率;对于OLAP,尽管Postgres查询分析功能很强,但是一般互联网公司的数据量实在太大,用Postgres这种数据库根本无法处理。通常会用MapReduce、Hive、Pig等大数据处理工具来分析;


4. 多线程模型,天然对高并发支持良好。而pg一直是多进程模型。进程的创建会更慢,更耗内存。虽然有些PG的连接池方案,但是MySQL在这方面“开箱即用”;


5. Postgres早期并不支持“逻辑复制”。物理复制意味着存储格式的细节完全暴露,不兼容的版本无法直接组成主从同步,于是无法做滚动升级。这就意味着在升级数据库时,必须停服,把整个集群升级后再恢复。而MySQL从一开始就是逻辑复制(这其实是由于MySQL一直是server和存储引擎分层的架构,逻辑复制发生在server层)。这个缺陷会让Postgres的运营不受业务开发者的待见。谁也不希望自己的业务停服。


反过来再看Postgres的优点,会发现对于OLTP并没有太大的吸引力:


1. 丰富的数据类型:通常用处不大,常用类型足够了。如果有复杂类型,业务上自己序列化,存储成varchar就行。可以用json,PB,avro等。序列化反序列化都发生在业务服务器,更好维护和优化;


2. 强大的审计函数:互联网早期活下来是一切,审计并不是核心需求(通常需要严格审计的领域早就会用Oracle/msSQL,不差钱);


3. 强大的索引:Postgres的自定义索引功能很强大。但是对于MySQL,关键的几列有索引就够了,不需要复杂的高级索引。我承认早期MySQL的查询优化器智商堪忧,但如果要改,一句explain,然后force index也就是了,对于开发人员简单直接。有一段时间LBS很流行,当时MongoDB很潮地直接支持了空间索引。当时大家纷纷“NoSQL”,就更不会看Postgres一眼。然后到了大概2015年,MySQL 5.7也支持空间索引了。


4. Posgres的MVCC实现牛不?牛。serial snapshot isolation是很强,但是到了需要变更数据严格一致的时候,select ... for update又不是不能用:)


5. 对于序列号,sequence是很好。但是互联网公司对于简单场景用auto increment,对于生产场景就直接用分布式序列号生成服务了。Postgres的序列号产生器~偏鸡肋。


6. Postgres的全文索引很强,但强得过ES?强得过专门定制的搜索引擎系统?要知道搜索业务最关键的是把“最匹配搜索人需要的搜索结果返回出来”,而不是仅仅“能搜到一堆不分主次但满足关键字匹配的结果”。


因此早期MySQL变成了事实上的互联网企业OLTP的事实标准。不管干啥业务,MySQL都不可或缺。在行业里跳槽来跳槽去的程序员普遍对MySQL也更熟悉。大量围绕MySQL的商业服务都成为了行业主流。新一代分布式数据库,像TiDB为了吸引用户,首先要做的是“兼容MySQL的语法”。


再往后,MySQL增加了更多“关系型数据库该有的”功能,比如完全支持ACID的innodb成为默认存储引擎,比如5.7的json原生支持,8.0的window function/CTE。而Postgres也增加了更多的“互联网功能”,但是时机已经过去了。大家MySQL跑着业务好好的,而切换数据库绝对不是仅仅像某些ORM标榜的换一个Dialect就行的,整个编程模型,性能表现,运维工具和流程都要有巨大的变化。如非必要,犯不着为了一个“most advanced”的标语去折腾,更不会为了数据库爱好者的情怀做伤害利益的事情。


2号知乎网友:罗诗亚


我已经不写代码、做技术管理一段时间了,但是有些支持工程师做技术选型的经验,根据业务上的需求来聊一聊吧。这里一半是我们技术选型时TL告诉我的,一半是我个人代码实践的经验。


数据库这种早期用了就基本不能换的东西是有滞后性的,你看到现在MySQL的现状,是“5年前MySQL是国内几乎唯一选择”造成的情况。5年前Postgres就已经在欧美初创项目里比较受欢迎了,国内公司数据量、体量是国外公司无法比的,毕竟用户人数多,随便都上亿,而且国外这几年新项目活得好的公司都是B2B,有几十万上百万用户量就很不错了。


Postgres有scaling issue(扩展问题?这个词中文怎么说),一个表2-3T就不行了,不做大量优化查询速度就以秒开始做单位了,这是云数据库提供商不会告诉你的。他们只会告诉你Postgres的优点。题外话,NoSQL也有类似的坏处。但是除非在生产环境中踩过坑,没有人会告诉你的。在技术社区里喷某个解决方案不行是会被鄙视的,特别是大公司,有这种体量业务的工程师是没时间跟你说这种扫兴的话的。


Postgres的好处之一是有好几年给新语言的ORM比MySQL成熟,对全栈工程师更友好。欧美的全栈工程师一般是脚本语言后端(Node、RoR、Python)加上前端。国内更流行的是强类型语言(Java)后端,一般不会同时前端的,Java + MySQL是真香。欧美这种全栈工程师的弱点就是对后端没有那么深的理解,这里就不细聊了。


前几年不需要运维支持就能部署的云服务提供商(Digital Ocean、Heroku)只支持Postgres。同上,全栈工程师一般是没有运维能力的。EC2上给你装个MySQL?RDS的文档能看懂就很不错了好吗~


MySQL对于你说的那些Postgres优点,都在国内有业界已经验证过,实施经验人数也很多的最佳解决方案。而且那些优点,是工程师做得爽而已,跟业务没啥实质性的关系。而踩过Postgres坑的这种人招不到,才是阻碍业务的第一大要素。


最后,为什么都是data类才用PG,因为data不是业务组,运维支持力度没那么大,也没有实时性能上的压力,上面的坏处不是什么坏处,好处却是可见的,能够提高开发速度的。


写得不对的请勿喷,哈哈。


3号知乎网友:灵剑


这可能还真的跟PHP有点关系,PHP很早的版本就有内置的mysql支持,很多Linux发行版都可以一键安装LAMP套件(Apache + MySQL + PHP),基本不用配置就可以开始用。其实国内PHP流行的时候已经有pgsql的支持了,但是习惯和早期沿袭的资料的影响仍然是巨大的。因为MySQL用得多,自然熟悉MySQL的DBA也多,熟悉pgsql的DBA少,也就进一步影响了其它语言的选型。


对于当时的大部分开发者和公司来说,PGSQL的那些高级功能反正也不会用,自然就跟不存在没什么两样。


4号知乎网友:聿明leslie


说说鄙人的见解。


从技术而言,PG 功能丰富,SQL 支持得很完备,强大的数据类型,严谨的关系模型,很难从关系模型去找出PG的不合理之处,多年积累,连全文索引词库都非常丰富,据说对于一些简单的搜索,都可以摆脱搜索引擎了,优化器做得很好,在代价选择上 PG 实现了基因算法,这一点连Oracle 也没有做到。


读过一部分 PG 的代码和 MySQL 的代码,对比起来,PG 的代码写得非常工整,注释也很细致,真的可以称得上code 教科书级别的工程,一定是一帮有情怀的coder 写出来的,对比起来,MySQL 就是一坨……


可是这个问题是一个工程性问题,就不要用这些方面来衡量一个工程问题!


历史总是时势造英雄,看看MySQL 火起来的那段时间,正是互联网爆发式增长的那几年。由于PG 丰富的功能,所以它显得太重了,多进程并发,再加上早期的存储做得不够好,太吃资源。在那个时代,内存和存储都是比较昂贵的资源,早期的PG 性能也不太好,由于关系模型支持得很好,用起来会有诸多限制,学习成本会比较高。


比起这些,MySQL 要轻量很多,到现在这也是它的一个优点,在互联网这个特定的场景中,大家为了追求快速迭代和拓展性,使用的 SQL 功能不会太多,都够用。


而PG 由于更严谨的 SQL 关系模型,很多用法都限制得比较死,MySQL 却要灵活很多,你的劣势就出来了。这个让用户用起来很爽,但是对于兼容 MySQL 的兼容实现者很痛苦;有些 feature 在特定的场景中用起很便利,但是在通用的模型中却禁不起推敲,要不要兼容它呢?但用户很难感知到这些,除非测试去乱试,一般人不会那么无聊,这就是工程上的权衡。很难说谁好谁坏。


而用的人多了,相关的使用经验会汇总到社区,形成部署方案、工具等,这又是工程中的正反馈。


在江湖中,有几个身负各项绝技的大侠最后成了将军和皇帝的?


5号知乎网友:flaneur


感觉是在几个互联网痛点的时间窗口没赶上,蛮可惜的。


之前 uber 有一篇文章:Why Uber Engineering Switched from Postgres to MySQL(link.zhihu.com/?target=
https%3A//eng.uber.com/Postgres-to-MySQL-migration/)


里面提到的几个问题现在我猜应该有解决,但是时间点晚了,比如:


  • 逻辑复制:之前 uber 用的物理复制,master 上一个 bug 导致数据损坏一个 bit 写错了,所有的从跟着坏。
  • Replica 事务糙:猜 Replica 的事务快照是怎么实现的?开一个事务快照 == 停止主从复制。
  • 写放大 + Replication 流量放大:与 MySQL 二级索引不同,Postgres 的索引指向的也是个物理位置,写入数据时,即使索引的值未变化,也要更新索引指向的物理地址,存在一点写放大,在物理复制的场景下,写放大 == 流量放大。
  • 连接管理:Postgres 一个连接一个进程,这时候你才想起来线程竟然是个轻量的东西。


MySQL 给人的感觉就是「我啥都挫,要啥特性没啥特性,事务都用起来没多少年,但是我十、二十年前就有主从逻辑复制跟 MHA」。


"为何MySQL在大陆成为主流,PostgreSQL屈居二线呢?"欢迎在留言区交流,留下你的观点~


整理丨dbaplus社群

来源丨知乎:zhihu.com/question/31955622

*仅为提供参考和学习交流,不代表dbaplus社群立场!dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

相关推荐

NET版本众多,傻傻分不清楚

面对.NET众多的版本,尤其还有几个名称的情况下,相信很多初学C#的开发人员都很困惑,搞不清究竟该怎么选择。下面就列举一下.NET的主要版本及其区别:.NETFramework(传统版本,仅适用于W...

.NET Framework 和 .NET Core 有啥区别?如何选择?

.NETFramework和.NETCore都是由Microsoft开发的软件框架,用于创建Windows应用程序和Web应用程序。它们的主要区别在于:支持的操作系统:.NET...

「分享」介绍一款倍受欢迎的.NET 开源UI库

概述今天要带大家了解的是一款WPF的开源控件库MahApps.Metro。MahApps.Metro是用于创建现代WPF应用程序的工具包,它许多开箱即用的好东西。目前支持的NETFramework...

.NET 5.0正式版发布:应用可在ARM64上原生运行

更多:o梵蒂冈图书馆频繁遭黑客攻击oNPM包被发现窃取敏感的Discord和浏览器文件o作者:硬核老王o(本文字数:712,阅读时长大约:1分钟).NET5.0正式版发布:应用可...

盘点8个热门.Net开源项目

一、SmartFormat:轻量级文本模板库,轻松替代string.Format项目地址:https://github.com/axuno/SmartFormatSmartFormat不仅继承了s...

.NET与Java开发:一场从框架到应用实例的深度对决

在软件开发这片广袤的战场上,.NET与Java两大开发平台如同两位身经百战的将军,各自率领着庞大的开发者队伍,在不同的应用场景中大放异彩。今天,我们就来一场从框架到应用实例的深度对决,看看这两大平台究...

TouchSocket:一个功能强大且易于使用的 .NET 网络通信框架

项目介绍TouchSocket是一个功能强大且易于使用的.NET网络通信框架,适用于C#、VB.Net和F#等语言。它提供了多种通信模块,包括TCP、UDP、SSL、WebSocket、Mo...

远离报错烦恼!深入全面掌握.NET Framework

由于Windows系统对.NETFramework这一系统组件有着极为特殊的要求,而部分应用软件及游戏对其的依赖性也近乎达到了驱动级的水准,使用或安装不当会遭遇许多“未知”的问题,因此如何掌握.NE...

想自己搭建.Net Web框架,开源项目太庞大看不懂,可以看这个教程

大家好,我是编程乐趣。一直以来,我都在运营知识星球,这个月也开始全职专心编写教程了。当时编写教程,就是发现很多程序员工作多年了,都没自己搭建过框架,也没接触过公司的框架底层代码。这就导致一些问题,无法...

.NET 8 + React 18 一体化开发框架!苏州码农十年匠心打磨

开篇前言从2014年入行至今,从WebForms到MVC,从JavaScript到React/Vue,从.NETFramework到.NETCore/8,技术栈的变迁伴随了我整个职业生涯。去年,我...

.Net Framework详解

相信有不少小伙伴遇到过这种情况:安装软件时提示.NetFramework未安装导致软件无法打开,或者需要安装.NetFramework4.0以上的组件。那.NetFramework是什么呢?....

系统小技巧:深入全面掌握.NET Framework

由于Windows系统对.NETFramework这一系统组件有着极为特殊的要求,而部分应用软件及游戏对其的依赖性也近乎达到了驱动级的水准,使用或安装不当会遭遇许多“未知”的问题,因此如何掌握.NE...

前端架构师成长之路:如何在 Vue 的计算属性中传递参数

在Vue中,计算属性(computed)是从其他响应式属性派生的属性,是用于自动监听响应式属性的变化,从而动态计算返回值。计算属性(computed)通常是一个没有参数的函数。当然如果需要像调...

Vue2 vs Vue3:核心差异与升级指南

Vue3自2020年发布以来,凭借其革命性的改进迅速成为开发者关注的焦点。本文将从架构设计、API模式、性能优化等多个维度深入对比Vue2和Vue3的核心差异,并提供代码示例帮助开发者...

突发!Vue3 投屏神器引爆程序员朋友圈

【AlarmLevel】重要【AlarmTitle】突发!Vue3投屏神器引爆程序员朋友圈【AlarmOverview】最近GitHub上名为vue-screen-share的仓库突...

取消回复欢迎 发表评论: