今天在知乎上看到这样一个问题:"postgresql也很强大,为何在中国大陆,mysql成为主流,postgresql屈居二线呢?"
问题地址:https://www.zhihu.com/question/31955622
我感觉postgresql非常强大,很多地方超过了mysql。
举几个例子:
1.丰富的数据类,支持数组、字典、json、序列号。
2.强大的审计函数
3.强大的索引,易于sql调优
postgresql在许多地方,有mysql无法比拟的优势。
但是在中国大陆,许多公司的核心业务库,都是mysql,postgresql则屈居二线,作为审计类的数据库来使用。
为什么不让postgresql来扛大梁呢,而要用mysql,postgresql不合适么?
整理了几个不错的回答,分享一下。
以下均为个人感觉,没做过统计,就当个参考吧。
mysql和postgres的早期完全是两个极端。mysql更像是个“基本上满足关系数据库语法的大号KV”,对关系型数据库的高级功能支持的很不好。我入行时接触的MySQL 5.1和MyISAM存储引擎,不支持ACID,但有如下几点在当时的互联网公司看来是非常合适:
反过来再看postgres的优点,会发现对于OLTP并没有太大的吸引力:
因此早期mysql变成了事实上的互联网企业OLTP的事实标准。不管干啥业务,mysql都不可或缺。在行业里跳槽来跳槽去的程序员普遍对mysql也更熟悉。大量围绕mysql的商业服务都成为了行业主流。新一代分布式数据库,像TiDB为了吸引用户,首先要做的是“兼容mysql的语法”。
再往后,mysql增加了更多“关系型数据库该有的”功能,比如完全支持ACID的innodb成为默认存储引擎,比如5.7的json原生支持,8.0的window function/CTE。而postgres也增加了更多的“互联网功能”。但是时机已经过去了。大家mysql跑着业务好好的。而切换数据库绝对不是仅仅像某些ORM标榜的换一个Dialect就行的。而是整个编程模型,性能表现,运维工具和流程都要有巨大的变化。如非必要,犯不着为了一个“most advanced"的标语去折腾,更不会为了数据库爱好者的情怀做伤害利益的事情。
链接:https://www.zhihu.com/question/31955622/answer/1625152059
说说鄙人的见解,从技术而言,PG 功能丰富,SQL 支持得很完备,强大的数据类型,严谨的关系模型,很难从关系模型去找出PG 的不合理之处,多年的积累,连全文索引词库都非常丰富,据说对于一些简单的搜索,都可以摆脱搜索引擎了,优化器做得很好,在代价选择上PG 实现了基因算法,这一点连Oracle 也没有做到。读过一部分PG 的代码和MySQL 的代码,对比起来,PG 的代码写得非常工整,注释也很细致,真的可以称得上code 教科书级别的工程,一定是一帮有情怀的coder 写出来的,对比起来,MySQL 就是一坨屎。。。
可是这个问题是一个工程性问题,就不要用这些方面来衡量一个工程问题!历史总是时势造英雄,看看MySQL 火起来的那段时间,正是互联网爆发式增长的那几年,由于PG 丰富的功能,所以它显得太重了,多进程并发,再加上早期的存储做得不够好,太吃资源,在那个时代,内存和存储都是比较昂贵的资源,早期的PG 性能也不太好,由于关系模型支持得很好,用起来会有诸多限制,学习成本会比较高,比起这些,MySQL 要轻量很多,到现在这也是它的一个优点,在互联网这个特定的场景中,大家为了追求快速迭代和拓展性,使用的SQL 功能不会太多,都够用,而PG 由于更严谨的SQL 关系模型,很多用法都限制得比较死,MySQL 却要灵活很多,你的劣势就出来了,这个让用户用起来很爽,但是对于兼容MySQL 的兼容实现者很痛苦,有些feature 在特定的场景中用起很便利,但是在通用的模型中却禁不起推敲,要不要兼容它呢?但用户很难感知到这些,除非测试去乱试,一般人不会那么无聊,这就是工程上的权衡。很难说谁好谁坏。
而用的人多了,相关的使用经验会汇总到社区,形成部署方案,工具等,这又是工程中的正反馈。
在江湖中,有几个身负各项绝技的大侠最后成了将军和皇帝的?
链接:https://www.zhihu.com/question/31955622/answer/133904562
感觉是在几个互联网痛点的时间窗口没赶上,蛮可惜的。
之前 uber 有一篇文章:Why Uber Engineering Switched from Postgres to MySQL
里面提到的几个问题现在我猜应该有解决,但是时间点晚了,比如:
MySQL 给人的感觉就是「我啥都挫,要啥特性没啥特性,事务都用起来没多少年,但是我十二十年前就有主从逻辑复制跟 MHA」。
链接:https://www.zhihu.com/question/31955622/answer/1625519578
这可能还真的跟PHP有点关系,PHP很早的版本就有内置的mysql支持,很多Linux发行版都可以一键安装LAMP套件(Apache + MySQL + PHP),基本不用配置就可以开始用。其实国内PHP流行的时候已经有pgsql的支持了,但是习惯和早期沿袭的资料的影响仍然是巨大的。因为MySQL用的多,自然熟悉MySQL的DBA也多,熟悉pgsql的DBA少,也就进一步影响了其它语言的选型。
对于当时的大部分开发者和公司来说,pgsql的那些高级功能反正也不会用,自然就跟不存在没什么两样。
链接:https://www.zhihu.com/question/31955622/answer/1626090963
PostgreSQL在全球也是二线,不独中国。PostgreSQL一直就功能比MySQL完备,唯独缺乏一个引爆点,导致生态长期不如MySQL。直到Oracle抄了MySQL的底,逼不少人不得不开始转用PostgreSQL。所以最近两年PostgreSQL有点起势,否则还要继续隐身。
MySQL如果从数据库特性来看,一开始是相当垃圾的,连事务处理都没有。但是人家命好,lamp(Linux+Apache+MySQL+PHP)组合听过没有?当年自建小网站和论坛的不二之选,背后还有诸如RedHat这样的公司推波助澜。
工程上的东西就是这样,用的人足够多,用的时间足够长,慢慢缺陷都会得到弥补,补不了的总会有人想出其它办法。
特性完备度只是技术选型的一个考量维度,其它诸如易上手程度、使用量、已知问题解决方案、是否很容易招到相关人才、社区活跃度等等也是需要考量的因素。
链接:https://www.zhihu.com/question/31955622/answer/1637481256
我已经不写代码做技术管理一段时间了,但是有些支持工程师做技术选型的经验,根据业务上的需求来聊一聊吧。这里一半是我们技术选型时TL告诉我的,一半是我个人代码实践哈。
数据库这种早期用了就基本不能换的东西是有滞后性的,你看到现在MySQL的现状,是5年前MySQL是国内几乎唯一选择的情况。5年前Postgres就已经在欧美初创项目里比较受欢迎了,
最后,为什么都是data类才用PG,因为data不是业务组,运维支持力度没那么大,也没有实时性能上的压力,上面的坏处不是什么坏处,好处却是可见的,能够提高开发速度的。
写得不对的请勿喷,哈哈。
链接:https://www.zhihu.com/question/31955622/answer/1640686511
小项目无所谓了,用起来都差不多。公司一大,数据量一大的话两个都不行。都要用非关系式数据库。而非关系式数据库说到底就是没有数据库,一切功能都要自己写。
我不喜欢谈“技术”就是因为这样。程序尤其是后端都很无聊、前端又充满三本转正JS程序员,还可能遇到友善度产品经理。所以我看着很多二流程序员为了某个“技术”的优劣争论不休总是觉得很可笑。无聊透顶、还不如回澄海教书。
链接:https://www.zhihu.com/question/31955622/answer/1637406028