PostgreSQL数据库和与mysql的性能比

若是很粗略地观察 PostgreSQL,会以为这个数据库系统和其它数据库很相似。由于 PostgreSQL 使用 SQL 语言来在执行资料的查询。这些资料经过连外键联系在一块儿,以一系列表格的形式存在。PostgreSQL 相对于竞争者的主要优点,主要的特征为可编程性:对于使用数据库资料的实际应用,PostgreSQL 让开发与使用的工做,变得更加容易。

SQL 数据在"平面表格"中存储简单的数据类型,须要用户使用查询把有关的信息收集在一块儿。这与应用和用户利用数据自身的方式相对立:典型的使用带有丰富数据类型的高级语言,在其中全部有关的数据做为它本身的一个完整单元来操做。典型的称呼为记录或对象(依据各自语言)。

转换来自 SQL 世界的信息到面向对象编程世界体现得很困难,由于二者有很是不一样的数据组织的模型。工业界把这个问题称为阻抗不匹配:从一个模型映射到另外一个要花费项目开发者 40% 的时间。一些映射解决方案,典型的称为对象-关系映射,致力于这个问题,可是它们花费不少并有自身的问题,致使糟糕的性能或强制全部的数据访问经过映射所支持的一种语言来进行。

PostgreSQL 能够直接在数据库中解决不少这种问题。PostgreSQL 容许用户定义基于正规的 SQL 类型的新类型,容许数据库自身理解复杂数据。例如,你能够定义一个 address 来组合一些事物如街道编号、城市和国度的字符串。从这一点上你能够轻易的创建把保存地址的所须要的全部字段包含在一个单一行列中的表。

PostgreSQL 还容许类型包括继承,这是在面向对象编程中的主要概念。例如,你能够定义 post_code 类型,并接着基于它创建 us_zip_code 和 canadian_postal_code。在数据库中的 address 就能够采用 us_address 或者 canadian_address 形式,而特定的规则能够在各自状况下验证数据。在 PostgreSQL 的早期版本中,实现新类型须要写 C 扩展并把它们编译到数据库服务器中;在版本 7.4 中,经过 CREATE DOMAIN 创建和使用定制类型变得很容易了。

数据库自身的编程能够从使用函数上得到巨大的利益。多数 SQL 系统容许用户写存储过程,它是其余 SQL 语句能够调用的一块 SQL 代码。可是 SQL 自身仍旧不适合做为编程语言,并且 SQL 用户在构造复杂逻辑时要经历巨大的困难。更糟糕的是,SQL 自身不支持不少的编程语言中最基本的操做,好比分支和循环。每一个厂商都转而写它们本身对 SQL 语言的扩展来增长这些特征,而这种扩展不是必须跨越数据库平台操做。

在 PostgreSQL 中程序员能够用一组可观的支持语言中任何一种来写这种逻辑。

相似于 Oracle 的过程语言 PL/SQL 的叫作 PL/PgSQL 的内置语言,在处理查询密集的过程时提供了独特的优点。 
流行脚本语言好比 Perl,Python,Tcl,和 Ruby 的包装器,容许利用它们在字符串处理和链接到广阔的外部函数库的力量。 
须要把复杂逻辑编译到机器代码所能提供的高性能的过程能够利用 C 或 C++。 
在更加深奥的方面,R 统计语言的处理器容许数据库查询利用它的一组丰富的统计函数。 
程序员能够把代码做为函数插入服务器中,它是使代码相似于存储过程的一个小包装器。以这种方式 SQL 代码能够调用(好比)C 代码或反之。

性能增进,由于数据库引擎在一个时间一个地方调用全部的逻辑,减小了在客户和服务器之间的来回往返的次数。 
可靠性增进,由于数据验证代码集中到一个地方,就在服务器上,而不用依赖在多个客户应用中的同步逻辑,它们甚至可能以多种编程语言写成。 
经过向服务器增长有用的抽象,客户代码能够变得更短小和简单。 
这些优点合起来能够证明 PostgreSQL 从编程角度是最高级的数据库系统。使用 PostgreSQL 能够显著的减小不少项目的总体编程时间,这种优点随着项目复杂而增加。

[编辑] 特征
[编辑] 函数
经过函数,能够在数据库服务器端执行指令程序。仅管这样的指令程序可使用基本的SQL语句写成,可是因为其缺少流程控制等功能,因此在PostgreSQL中引入了使用其它程序语言编写函数的能力,包括:

一个内置的名为PL/pgSQL的过程语言,相似于Oracle的PL/SQL; 
包括PL/Perl,plPHP,PL/Python,PL/Ruby,PL/sh,PL/Tcl与 PL/Scheme在内的脚本语言; 
编译语言:C,C++,或Java(经过PL/Java)。 
R统计语言(PL/R)。 
以上部分的语言,甚至能够在触发器内执行。PostgreSQL支持行返回函数:它们的输出是一系列行类型数据的集合,能够在查询中看成表来使用。函数也能够被定义成以建立者或者调用者的身份运行。在某些场合,或者其余的数据库产品中,函数也会被称为“存储过程”,但技术上这二者并未有太大分别。

[编辑] 索引
在PostgreSQL中,用户能够自定义索引方法,或使用内置的B-tree,哈希表与GiST索引。PosrgreSQL的索引功能同时也具备如下功能:

反向索引检索:无须额外的索引就能实现相似ORDER BY field DESC的操做。 
表达式索引:能够创建基于表达式值而非数值或列的索引。 
部分索引:仅索引表的部分,能够经过在CREATE INDEX语句口添加WHERE 从句以建立更小的索引。 
位图索引扫描:从8.1版开始支持此功能。该功能将读取多个索引,生成表示它们之间符合查询标准的多元组交集的位图。这样解决了混合索引的问题。在一个具备20列的表中,理论上能建立 20! 个索引,在实际应用中已不现实。使用位图索引扫描后,在每次查询时,它将能把约束条件中所涉及列各自的索引进行任意的排列组合。 
[编辑] 触发器
触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器。触发器一般由INSERT或UPDATE语句触发。

在PostgreSQL中,可在数据表上设置触发器,但没法在视图中设置(对视图的UPDATE或者INSERT操做可使用规则(RULE)定义)。多个触发器可依据字母顺序依次执行。此外,除了使用内嵌的PL/PgSQL语言以外,触发器的函数也能够用PL/Perl,PL/Python等语言编写。

[编辑] 多版本并发控制
PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每一个用户提供了一个数据库的“快照”,用户在事务内所做的每一个修改,对于其余的用户都不可见,直到该事务成功提交。这从很大程度上减小了对读取锁的依赖,同时保证了数据库高效地符合ACID原则。

[编辑] 规则
规则(RULE)容许一个查询能被重写,一般被用做实现可更新的视图。

[编辑] 数据类型
PostgreSQL内置丰富的数据类型,包括:

任意精度的数值 
无限制长度文本 
几何图元 
IP地址与IPv6地址 
无类域间路由地址块,MAC地址 
数组 
此外,用户能够建立自定义数据类型,一般经过PostgreSQL的GiST机制,它们也能被很好得索引,好比PostGIS地理信息系统的数据类型。

[编辑] 用户定义对象
用户能够为数据库内几乎全部的对象定义新的类型,包括:

索引 
操做符(可重载现有操做符。) 
聚合函数 
数据域 
数据类型转换 
会话(编码转换) 
[编辑] Tools
Database Master - PostgreSQL Management Studio 
[编辑] 继承
数据表的结构及属性可从一个“父”表中继承,数据将在二者间共享。对子表中数据的插入或者删除也将在父表中体现,一样,对父表做出的修改,好比添加列等操做也会致使子表产生相应改动。该功能还没有彻底实现,实际上,表的约束尚不能继承。好比,在一张外联参考了父表id字段的表中,插入一条具备子表中某条记录id数据的记录会致使失败,由于PostgreSQL在对父表的外键约束检查中不会检查子表的内容。

[编辑] 其余功能
关系完整性约束:包括外联键,列约束与行检查 
视图:暂时没有实现可更新视图,但可以使用规则系统实现相同功能 
Full, inner, outer (left/right) 联合查询 
子查询 
事务处理 
支持大部分SQL:2003标准的主要特征 [2] 以及不支持部分 将来版本的支持状况,可至已有版本手册中查询。 
SSL加密链接 
二进制/文本 大对象的存储 
在线备份 
数据域 
表分区 
表空间 
保存点 
时刻点恢复 
两段式提交 
TOAST(The Oversized-Attribute Storage Technique,超大属性存储技术)用以透明地将超大表属性(如大MIME附件或XML消息)压缩后存储至独立的区域 
正则表达式 [3] 
[编辑] 扩展
地理数据对象:PostGIS GPL 
全文检索:经过 Tsearch2 或 OpenFTS, 将在8.3版本中内嵌Tsearch2。 GPL 
多种异步主/从复制方案,包括Slony-I(BSD受权),Mammoth Replicator 

XML/XSLT支持 contrib软件包中的XPath扩展 GPL  程序员

一.MySQL的主要优势
  一、首先是速度,MySQL一般要比PostgreSQL快得多。MySQL自已也宣称速度是他们追求的主要目标之一,基于这个缘由,MySQL在之前的文档中也曾经说过并不许备支持事务和触发器。可是在最新的文档中,咱们看到MySQL 4.0.2-alpha已经开始支持事务,并且在MySQL的TODO中,对触发器、约束这样的注定会下降速度的功能也列入了日程。可是,咱们仍然有理由相信,MySQL将有可能一直保持速度的优点。
  二、MySQL比PostgreSQL更流行,流行对于一个商业软件来讲,也是一个很重要的指标,流行意味着更多的用户,意味着经受了更多的考验,意味着更好的商业支持、意味着更多、更完善的文档资料。
  三、与PostgreSQL相比,MySQL更适宜在Windows环境下运行。MySQL做为一个本地的Windows应用程序运行(在NT/Win2000/WinXP下,是一个服务),而PostgreSQL是运行在Cygwin模拟环境下。PostgreSQL在Windows下运行没有MySQL稳定,应该是能够想象的。
  四、MySQL使用了线程,而PostgreSQL使用的是进程。在不一样线程之间的环境转换和访问公用的存储区域显然要比在不一样的进程之间要快得多。
  五、MySQL能够适应24/7运行。在绝大多数状况下,你不须要为MySQL运行任何清除程序。PostgreSQL目前仍不彻底适应24/7运行,这是由于你必须每隔一段时间运行一次VACUUM。
  六、MySQL在权限系统上比PostgreSQL某些方面更为完善。PostgreSQL只支持对于每个用户在一个数据库上或一个数据表上的INSERT、SELECT和UPDATE/DELETE的受权,而MySQL容许你定义一整套的不一样的数据级、表级和列级的权限。对于列级的权限,PostgreSQL能够经过创建视图,并肯定视图的权限来弥补。MySQL还容许你指定基于主机的权限,这对于目前的PostgreSQL是没法实现的,可是在不少时候,这是有用的。
  七、因为MySQL 4.0.2-alpha开始支持事务的概念,所以事务对于MySQL再也不仅仅成为劣势。相反,由于MySQL保留无事务的表类型。这就为用户提供了更多的选择。
  八、MySQL的MERGE表提供了一个独特管理多个表的方法。
  九、MySQL的myisampack能够对只读表进行压缩,此后仍然能够直接访问该表中的行。
  
二.PostgreSQL的主要优势:
  一、对事务的支持与MySQL相比,经历了更为完全的测试。对于一个严肃的商业应用来讲,事务的支持是不可或缺的。
  二、MySQL对于无事务的MyISAM表。采用表锁定,一个长时间运行的查询极可能会长时间地阻碍对表的更新。而PostgreSQL不存在这样的问题。
  三、PostgreSQL支持存储过程,而目前MySQL不支持,对于一个严肃的商业应用来讲,做为数据库自己,有众多的商业逻辑的存在,此时使用存储过程能够在较少地增长数据库服务器的负担的前提下,对这样的商业逻辑进行封装,并能够利用数据库服务器自己的内在机制对存储过程的执行进行优化。此外存储过程的存在也避免了在网络上大量的原始的SQL语句的传输,这样的优点是显而易见的。
  四、对视图的支持,视图的存在一样能够最大限度地利用数据库服务器内在的优化机制。并且对于视图权限的合理使用,事实上能够提供行级别的权限,这是MySQL的权限系统所没法实现的。
  五、对触发器的支持,触发器的存在不可避免的会影响数据库运行的效率,可是与此同时,触发器的存在也有利于对商业逻辑的封装,能够减小应用程序中对同一商业逻辑的重复控制。合理地使用触发器也有利于保证数据的完整性。
  六、对约束的支持。约束的做用更多地表如今对数据完整性的保证上,合理地使用约束,也能够减小编程的工做量。
  七、对子查询的支持。虽然在不少状况下在SQL语句中使用子查询效率低下,并且绝大多数状况下可使用带条件的多表链接来替代子查询,可是子查询的存在在不少时候仍然不可避免。并且使用子查询的SQL语句与使用带条件的多表链接相比具备更高的程序可读性。
  八、支持R-trees这样可扩展的索引类型,能够更方便地处理一些特殊数据。
  九、PostgreSQL能够更方便地使用UDF(用户定义函数)进行扩展。
正则表达式

相关文章
相关标签/搜索