你找一个能安装起来的数据库,都可以学,不管什么版本。

数据库的基本功,是那些基本概念(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并没有太大的吸引力:

  1. 丰富的数据类型 - 通常用处不大,常用类型足够了。如果有复杂类型,业务上自己序列化,存储成varchar就行。可以用json,PB,avro等。序列化反序列化都发生在业务服务器,更好维护和优化;
  2. 强大的审计函数 - 互联网早期活下来是一切,审计并不是核心需求(通常需要严格审计的领域早就会用Oracle/MSql,不差钱);
  3. 强大的索引。postgres的自定义索引功能很强大。但是对于mysql,关键的几列有索引就够了,不需要复杂的高级索引。我承认早期mysql的查询优化器智商堪忧,但如果要改,一句explain,然后force index也就是了。对于开发人员简单直接。有一段时间LBS很流行,当时mongo很潮的直接支持了空间索引。当时大家纷纷的“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"的标语去折腾,更不会为了数据库爱好者的情怀做伤害利益的事情。

主流数据库哪个最好?哪个现在最火?

商业Oracle,微软SQLServer,免费MySQL。

也可以看一下这个数据库排行榜 DB-Engines Ranking,可以看到关系数据库数据库中,上面三者的流行度远抄其他数据库。而非关系数据库,比较流行的就是 MongoDB 和 Redis 了。

PostgreSQL,MongoDB,Redis上涨很猛,Oracle,MSSQL,少许下降,MySQL几乎不变

postgresql很强大,为何在中国,mysql成为主流?的更多相关文章

  1. 值得推荐的C/C++框架和库 (真的很强大) c

    http://m.blog.csdn.net/mfcing/article/details/49001887 值得推荐的C/C++框架和库 (真的很强大) 发表于2015/10/9 21:13:14 ...

  2. 【转】 值得推荐的C/C++框架和库 (真的很强大)

    [转] 值得推荐的C/C++框架和库 (真的很强大) 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个 ...

  3. js中的console很强大

    今天闲来没事,瞎逛, 发现了淘宝首页的这个: 想起来之前在百度的 页面中也曾看到过.于是乎自己试一试. 于是便见识到了console对象其实很强大,用好它对调试真的有很大帮助. 代码: <!DO ...

  4. (转)iOS被开发者遗忘在角落的NSException-其实它很强大

    转载自 http://www.jianshu.com/p/05aad21e319e iOS被开发者遗忘在角落的NSException-其实它很强大 字数597 阅读968 评论4 喜欢28 NSExc ...

  5. 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)

    开发快很重要——如果只看语法或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦,太慢了,太麻烦了,虽然在反复调试和优化之后,最后产品的结果可能还不错. Delphi的最大特 ...

  6. android:分享 一个很强大的LOG开关---Log.isLoggable

    标签:android分享 一个很强大的log开 1.API亮点: 此API可以实现不更换APK,在出问题的手机上就直接能抓到有效log,能提升不少工作效率. 2.API介绍 最近在解决短信问题时,看到 ...

  7. Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件

    Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...

  8. firebug定位工具很强大

    firebug这个工具很强大,如果实在找不到自己想要的元素,就安装firebug这个定位工具妥妥的

  9. 曾经很强大的免费 ERP 2BizBox

    曾经很强大的免费 ERP 2BizBox 整个功能很强大,特别是生产,工单也很完善,有损耗,有反冲等功能. 流程比较规矩,需要先采购后才能使用,只有生产后才能销售,工单有组装和拆装,工程有工程更改,也 ...

随机推荐

  1. 这可能是你看过最详细的NodeJS安装配置教程

    博主是一枚Java菜鸡,今天在B站上看一些教程视频的时候偶尔看了一眼评论区,发现好多人在Node和Vue安装的位置卡住了,便决定今晚肝出一套最详细的NodeJS安装配置的教程 本文适合初次接触Node ...

  2. [loj6500]操作

    差分,令$b_{i}=a_{i-1}\oplus a_{i}$,对于一个区间$[l,r]$,相当于令$a_{l-1}=a_{r+1}=0$之后求出$b_{l..r+1}$,对区间$[i-k,i)$异或 ...

  3. Lilypond+TexLive(LuaLatex+lyluatex)+VS Code实现谱文混排

    没想到发文章反而更难被预览了,那就复制一份到随笔里好了. 多次尝试之下,终于实现了现阶段谱文混排的最理想方式: 1. 综合Latex的排版(还有广泛适用人群)的优势以及Lilypond的美观优势: 2 ...

  4. springboot静态工具类bean的注入

    工具类中调用数据.但是由于工具类方法一般都写成static,所以直接注入就存在问题. 所以写成了这样: package com.rm.framework.core; import org.spring ...

  5. springboot和springcloud版本上的选择

    现在的springboot项目和cloud版本都是更新很快,但我们开发不是版本越新越好,我们要把版本对应起来,那么我们怎么去关联呢? springboot和springcloud不是越新越好,clou ...

  6. SQL 跨实例操作

    SQL 跨实例操作 我使用的是 OpenDataSource 函数,假设你要在其他机器上访问 192.168.0.1 上的数据库: SELECT A.[Name], B.[SkillName], B. ...

  7. Python+selenium 之xpath定位

  8. P6072 『MdOI R1』Path

    考虑我们有这样操作. 我们只要维护两点在子树内和两点在子树外的异或和即可. 前者可以类似于线段树合并的trie树合并. 后者有两种做法: 一种是把dfn序翻倍:然后子树补变成了一个区间最大异或问题,可 ...

  9. Codeforces 356E - Xenia and String Problem(哈希)

    Codeforces 题面传送门 & 洛谷题面传送门 首先显然一个 gray 串的长度只可能是 \(2^k-1\),其中 \(k\in\mathbb{Z}\). 考虑将一个字符改成另外一个字符 ...

  10. 洛谷 P3266 - [JLOI2015]骗我呢(容斥原理+组合数学)

    题面传送门 神仙题. 首先乍一看此题非常棘手,不过注意到有一个条件 \(0\le x_{i,j}\le m\),而整个矩阵恰好有 \(m\) 列,这就启发我们考虑将每个元素的上下界求出来,如果我们第一 ...