本帖最后由 osdba 于 2010-09-01 19:06 编辑
Postgresql主要优势: 1. Postgresql完全免费,而且是BSD协议,如果你把Postgresql改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了Postgresql数据库不会被其它公司控制。oracle数据库不用说了,是商业数据库,不开放。而MysqL数据库虽然是开源的,但现在随着SUN被oracle公司收购,现在基本上被oracle公司控制,其实在SUN被收购之前,MysqL中最重要的InnoDB引擎也是被oracle公司控制的,而在MysqL中很多重要的数据都是放在InnoDB引擎中的,反正我们公司都是这样的。所以如果MysqL的市场范围与oracle数据库的市场范围冲突时,oracle公司必定会牺牲MysqL,这是毫无疑问的。 2. 与Postgresql配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy等等,很容易做读写分离、负载均衡、数据水平拆分等方案,而这在MysqL下则比较困难。 3. Postgresql源代码写的很清晰,易读性比MysqL强太多了,怀疑MysqL的源代码被混淆过。所以很多公司都是基本Postgresql做二次开发的。 4. Postgresql在很多方面都比MysqL强,如复杂sql的执行、存储过程、触发器、索引。同时Postgresql是多进程的,而MysqL是线程的,虽然并发不高时,MysqL处理速度快,但当并发高的时候,对于现在多核的单台机器上,MysqL的总体处理性能不如Postgresql,原因是MysqL的线程无法充分利用cpu的能力。 目前只想到这些,以后想到再添加,欢迎大家拍砖。 Postgresql与oracle或InnoDB的多版本实现的差别 Postgresql与oracle或InnoDB的多版本实现最大的区别在于最新版本和历史版本是否分离存储,Postgresql不分,而oracle和InnoDB分,而innodb也只是分离了数据,索引本身没有分开。 Postgresql的主要优势在于: 1. Postgresql没有回滚段,而oracle与innodb有回滚段,oracle与Innodb都有回滚段。对于oracle与Innodb来说,回滚段是非常重要的,回滚段损坏,会导致数据丢失,甚至数据库无法启动的严重问题。另由于Postgresql没有回滚段,旧数据都是记录在原先的文件中,所以当数据库异常crash后,恢复时,不会象oracle与Innodb数据库那样进行那么复杂的恢复,因为oracle与Innodb恢复时同步需要redo和undo。所以Postgresql数据库在出现异常crash后,数据库起不来的几率要比oracle和MysqL小一些。 2. 由于旧的数据是直接记录在数据文件中,而不是回滚段中,所以不会象oracle那样经常报ora-01555错误。 3. 回滚可以很快完成,因为回滚并不删除数据,而oracle与Innodb,回滚时很复杂,在事务回滚时必须清理该事务所进行的修改,插入的记录要删除,更新的记录要更新回来(见row_undo函数),同时回滚的过程也会再次产生大量的redo日志。 4. WAL日志要比oracle和Innodb简单,对于oracle不仅需要记录数据文件的变化,还要记录回滚段的变化。 Postgresql的主要劣势在于: 1、最新版本和历史版本不分离存储,导致清理老旧版本需要作更多的扫描,代价比较大,但一般的数据库都有高峰期,如果我们合理安排VACUUM,这也不是很大的问题,而且在Postgresql9.0中VACUUM进一步被加强了。 2、由于索引中完全没有版本信息,不能实现Coverage index scan,即查询只扫描索引,直接从索引中返回所需的属性,还需要访问表。而oracle与Innodb则可以; Postgresql9.0中的特色功能: Postgresql中的Hot Standby功能 也就是standby在应用日志同步时,还可以提供只读服务,这对做读写分离很有用。这个功能是oracle11g才有的功能。 Postgresql异步提交(Asynchronous Commit)的功能: 这个功能oracle中也是到oracle11g R2才有的功能。因为在很多应用场景中,当宕机时是允许丢失少量数据的,这个功能在这样的场景中就特别合适。在Postgresql9.0中把synchronous_commit设置为false就打开了这个功能。需要注意的是,虽然设置为了异步提交,当主机宕机时,Postgresql只会丢失少量数据,异步提交并不会导致数据损坏而数据库起不来的情况。MysqL中没有听说过有这个功能。 Postgresql中索引的特色功能: Postgresql中可以有部分索引,也就是只能表中的部分数据做索引,create index 可以带where 条件。同时Postgresql中的索引可以反向扫描,所以在Postgresql中可以不必建专门的降序索引了。 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。