PostgreSQL在与mysql的比较中稍微弱势项:

1.都是堆表,没有所谓的聚集索引表,其实问题不大,聚集索引表也只是在使用聚集索引那些列有加速,而且pg也有聚集索引,只不过要定期重建。

2.mvcc实现,pg是直接在原来page中标记删除、更新行。而mysql的innedb则是像oracle一样,弄了一个垃圾回收区存放这些并发的版本。

  1)pg这样做的好处是更新、删除很快,数据恢复也很快。坏处是进行垃圾清理时会扫描page,增加IO消耗,而且在进行垃圾回收时的设置策略需要DBA去设计,较复杂,刚刚使用的人不了解,可能导致autovaccum设置了也不会生效,进而导致垃圾数据的积压。

  2)同样是mvcc这种方式,对于高频更新的大表来说,可以在建表的时候设置fillfactor,进而使表的更新发生hot update,在更新时索引不会改变,只是索引指向的ctid重定向到了新行的ctid。这同样是考验DBA的设计能力,初学者在不知道的情况下会觉得更新不但要更新表的tuple,还要更新index的tuple。

那么在mysql中怎么做呢?更新时将旧的行拷贝到垃圾回收区,然后将老行的数据替换为新行数据,索引不用修过。那么数据拷贝的过程也是比较耗时的。

3.正是基于这种mvcc的实现,很多人认为pg不适合做在线事物数据库,这是不合理的。

  1)这种实现方式在大表的高频更新时可能会比mysql慢一点,但不存在太大差距。

  2)在数据的分析处理上,pg的jion实现则要优于mysql,这也是大家公认pg在替代oracle中优势的地方。

总结:

  在线事物上,pg占稍微劣势,但不存在太大差异,90%的应用都感知不到这种差异。

  在线分析上,pg占优势,稍微复杂的应用都能感受到。

  

  作为一个混合型数据库需求时,pg完胜mysql。

且pg12将添加新的存储引擎,借鉴innerdb实现方式,这样在OLTP业务上将不再有劣势……,同样,mysql也可以学习pg在企业级应用上的严谨和多表分析上的技术来改进。未来两种数据库将不分高下,都能覆盖大多数应用场景。

思考--PostgreSQL在与mysql的比较中稍微弱势项的更多相关文章

  1. MySQL 5.6 中一个重要的优化——Index Condition Pushdown,究竟push down了什么

    1        问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语 ...

  2. MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  3. 为什么选择PostgreSQL而不是MySQL

    David Bolton是一名独立开发者,他使用PostgreSQL和MySQL都已有超过十年的时间.近日,他撰文阐述了选择PostgreSQL而不是MySQL的理由.他认为,MySQL之所以仍然如此 ...

  4. 【Mysql】—— MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  5. MySQL存储引擎中的MyISAM和InnoDB

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  6. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  7. mysql 5.7中的用户权限分配相关解读!

    这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...

  8. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

  9. 在MySQL向表中插入中文时,出现:incorrect string value 错误

    在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8.      一.修改数据库的默认字符集   ...

随机推荐

  1. 51 Nod 阶乘后面0的数量

    1003 阶乘后面0的数量  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 72 ...

  2. vue路由 routers的写法:require用与不用

    vue路由的写法有很多种,这里我只说routers的写法,一种是compcomponent后面直接写路径,另一种是用require的方式,来看代码 import Vue from 'vue' impo ...

  3. 各种框架实现了经典的 todo 应用

    http://todomvc.com/ 版权声明:本文为博主原创文章,未经博主允许不得转载.

  4. mysql 查询一个月的数据

    //今天 select * from 表名 where to_days(时间字段名) = to_days(now()); //昨天 SELECT * FROM 表名 WHERE TO_DAYS( NO ...

  5. 使用layui异步请求上传图片在tp5.1环境下出现“请对上传接口返回json”的错误的解决方法

    正常情况下返回json数据使用return json(); 但是使用layui会报错,然后想到了使用json_encode()包装一下用一个变量接收后,再使用return();返回接收json格式的变 ...

  6. 数字 kotlin (1)

    数字Kotlin 处理数字在某种程度上接近 Java,但是并不完全相同.例如,对于数字没有隐式拓宽转换(如 Java 中 int 可以隐式转换为 long ——译者注),另外有些情况的字面值略有不同. ...

  7. Linux高级调试与优化——进程管理和调度

    进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...

  8. tomcat 日志拆分

    一.用cronolog分割tomcat的catalina.out文件 1.编译安装cronologwget http://cronolog.org/download/cronolog-1.6.2.ta ...

  9. C++重写实践&与java的差异

    C++重写父类方法后,父类中同名的方法在子类中就无法被调用,回报这个问题: java中是没有这个问题的,显然java设计者在设计的时候有意解决了这个问题. C++实践代码: #include < ...

  10. vue问题八:动态加载loading、浏览器图标

    全局动态加载loading: 参考文档:https://blog.csdn.net/qq_34825875/article/details/79570301 在main.js或者index.js引用  ...