postgresql很强大,为何在中国,mysql成为主流?
你找一个能安装起来的数据库,都可以学,不管什么版本。
数据库的基本功,是那些基本概念(SQL,表,存储过程,索引,锁,连接配置等等),这些在任何一个版本中都是一样的。
postgresql很强大,为何在中国大陆,mysql成为主流?
可以看相关的问题:为什么国内流行mybatis,国外反而多用hibernate?
1. https://www.zhihu.com/question/309662829
2. https://zhuanlan.zhihu.com/p/439807305
3. https://www.cnblogs.com/jpfss/p/10882139.html
时势造英雄
- 可能跟PHP有点关系
PHP很早的版本就有内置的mysql支持,很多Linux发行版都可以一键安装LAMP套件(Apache + MySQL + PHP),基本不用配置就可以开始用。其实国内PHP流行的时候已经有pgsql的支持了,但是习惯和早期沿袭的资料的影响仍然是巨大的。因为MySQL用的多,自然熟悉MySQL的DBA也多,也就进一步影响了其它语言的选型。
对于当时的大部分开发者和公司来说,pgsql的那些高级功能反正也不会用,自然就跟不存在没什么两样。
- mysql和postgres的早期完全是两个极端。
mysql更像是个“基本上满足关系数据库语法的大号“K V”,对关系型数据库的高级功能支持的很不好。
为什么说PostgreSQL非常厉害?
互联网公司为了扩展,长期的经验是,仅仅把数据库当作是一个“存储”,而非存储+核心数据逻辑的计算节点。大量的计算都在业务服务器上进行,而业务服务器可以无限水平扩展,而无需担心有状态的数据迁移问题;
因为没有提供很多高级功能和数据一致性的保障,mysql对于简单的sql支持的反而更加直接,在速度上有很大的优势;
对于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等大数据处理工具来分析;
多线程模型,天然对高并发支持良好。而pg一直是多进程模型。进程的创建会更慢,更耗内存。虽然有些pg的连接池方案,但是mysql在这方面“开箱即用”;
postgres早期并不支持“逻辑复制”。物理复制意味着存储格式的细节完全暴露,不兼容的版本无法直接组成主从同步,于是无法做滚动升级。这就意味着在升级数据库时,必须停服,把整个集群升级后再恢复。而mysql从一开始就是逻辑复制(这其实是由于mysql一直是server和存储引擎分层的架构,逻辑复制发生在server层)。这个缺陷会让postgres的运营不受业务开发者的待见。谁也不希望自己的业务停服。
反过来再看postgres的优点,会发现对于OLTP并没有太大的吸引力:
- 丰富的数据类型 - 通常用处不大,常用类型足够了。如果有复杂类型,业务上自己序列化,存储成varchar就行。可以用json,PB,avro等。序列化反序列化都发生在业务服务器,更好维护和优化;
- 强大的审计函数 - 互联网早期活下来是一切,审计并不是核心需求(通常需要严格审计的领域早就会用Oracle/MSql,不差钱);
- 强大的索引。postgres的自定义索引功能很强大。但是对于mysql,关键的几列有索引就够了,不需要复杂的高级索引。我承认早期mysql的查询优化器智商堪忧,但如果要改,一句explain,然后force index也就是了。对于开发人员简单直接。有一段时间LBS很流行,当时mongo很潮的直接支持了空间索引。当时大家纷纷的“NoSQL”,就更不会看postgres一眼。然后到了大概2015年,mysql 5.7也支持空间索引了。
- Posgres的MVCC实现牛逼不,牛。serial snapshot isolation是很强。但是到了需要变更数据严格一致的时候,select ... for update又不是不能用:)
- 对于序列号,sequence是很好。但是互联网公司对于简单场景用auto increment。对于生产场景就直接用分布式序列号生成服务了。postgres的序列号产生器~偏鸡肋。
- 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"的标语去折腾,更不会为了数据库爱好者的情怀做伤害利益的事情。
主流数据库哪个最好?哪个现在最火?
商业Oracle,微软SQLServer,免费MySQL。
也可以看一下这个数据库排行榜 DB-Engines Ranking,可以看到关系数据库数据库中,上面三者的流行度远抄其他数据库。而非关系数据库,比较流行的就是 MongoDB 和 Redis 了。
PostgreSQL,MongoDB,Redis上涨很猛,Oracle,MSSQL,少许下降,MySQL几乎不变
postgresql很强大,为何在中国,mysql成为主流?的更多相关文章
- 值得推荐的C/C++框架和库 (真的很强大) c
http://m.blog.csdn.net/mfcing/article/details/49001887 值得推荐的C/C++框架和库 (真的很强大) 发表于2015/10/9 21:13:14 ...
- 【转】 值得推荐的C/C++框架和库 (真的很强大)
[转] 值得推荐的C/C++框架和库 (真的很强大) 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个 ...
- js中的console很强大
今天闲来没事,瞎逛, 发现了淘宝首页的这个: 想起来之前在百度的 页面中也曾看到过.于是乎自己试一试. 于是便见识到了console对象其实很强大,用好它对调试真的有很大帮助. 代码: <!DO ...
- (转)iOS被开发者遗忘在角落的NSException-其实它很强大
转载自 http://www.jianshu.com/p/05aad21e319e iOS被开发者遗忘在角落的NSException-其实它很强大 字数597 阅读968 评论4 喜欢28 NSExc ...
- 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)
开发快很重要——如果只看语法或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦,太慢了,太麻烦了,虽然在反复调试和优化之后,最后产品的结果可能还不错. Delphi的最大特 ...
- android:分享 一个很强大的LOG开关---Log.isLoggable
标签:android分享 一个很强大的log开 1.API亮点: 此API可以实现不更换APK,在出问题的手机上就直接能抓到有效log,能提升不少工作效率. 2.API介绍 最近在解决短信问题时,看到 ...
- Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件
Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...
- firebug定位工具很强大
firebug这个工具很强大,如果实在找不到自己想要的元素,就安装firebug这个定位工具妥妥的
- 曾经很强大的免费 ERP 2BizBox
曾经很强大的免费 ERP 2BizBox 整个功能很强大,特别是生产,工单也很完善,有损耗,有反冲等功能. 流程比较规矩,需要先采购后才能使用,只有生产后才能销售,工单有组装和拆装,工程有工程更改,也 ...
随机推荐
- [loj2462]完美的集合
当$k$个集合依次为$S_{1},S_{2},...,S_{k}$时,称$x$合法当且仅当: 1.$\forall 1\le i\le k,x\in S_{i}$ 2.$\forall y\in \b ...
- 第十四章 kubernetes 核心技术-调度器
一.概述 一个容器平台的主要功能就是为容器分配运行时所需要的计算,存储和网络资源.容器调 度系统负责选择在最合适的主机上启动容器,并且将它们关联起来.它必须能够自动的处 理容器故障并且能够在更多的主机 ...
- 间断有限元h自适应处理方法
细分单元 function Hrefine2D(refineflag) 根据refineflag变量细分单元,其中refineflag变量大小为 [Kx1],需要细分单元标记为1,不需要单元为0. 根 ...
- R同时保存png/pdf等格式图片
R怎么同时保存png/pdf等多种格式的图片? 如果是ggplot对象,用ggsave用两下就行,如果不是呢? png/pdf()组合dev.off()是通常保存方法,但一个组合只能保存一个图片.要想 ...
- R语言与医学统计图形【7】低级绘图函数
R语言基础绘图系统 基础绘图包之低级绘图函数--气泡图.一页多图.背景网格.添加线条和散点.数学表达式 4.气泡图 symbols是高级绘图函数,可在图上添加标记,标记的形状包括:circles,sq ...
- 毕业设计之zabbix+微信企业号报警
需要自己申请一个微信企业号 创建应用 AgentId 1000003 Secret SOI8b20G96yUVM29K02-bP5N5o6dovwSF2RrDaXHJNg 企业ID(自己再企业信息里面 ...
- EXCEL-REPLACE()替换字符串最后几位 删除字符串最后几位
字符串 0M5(烈焰红) 我要删除最后一个字符")" 公式=REPLACE(ASC(字符串),LEN(ASC(字符串)),1,"") 解释:=REPLAC ...
- javaSE高级篇3 — 网络编程 — 更新完毕
网络编程基础知识 先来思考两个问题( 在这里先不解决 ) 如何准确的找到一台 或 多台主机? 找到之后如何进行通讯? 网络编程中的几个要素 IP 和 端口号 网络通讯协议:TCP / UDP 最后一句 ...
- 零基础学习java------39---------json格式交互,Restful(不懂),静态资源映射,SSM整合(ssm整合思想,application.xml文件详解(声明式事务管理),)
一. json格式交互(知道) 1 . 回顾ajax基本语法 $.ajax({ url:"", // 请求的后台路径 data:{"":"" ...
- CVTE第二次笔试
选择瞎答得,直接编程题目 1. 使用递归将字符串中的数字去并按顺序打印 输入例 adfsafsfs123123eogie09789 输出例 123123 09789 #include<iost ...