PostgreSQL与MySQL比较

特性 MySQL PostgreSQL
实例 经过执行 MySQL 命令(mysqld)启动实例。一个实例能够管理一个或多个数据库。一台服务器能够运行多个 mysqld 实例。一个实例管理器能够监视 mysqld 的各个实例。
经过执行 Postmaster 进程(pg_ctl)启动实例。一个实例能够管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,全部数据都存储在这个目录中。使用 initdb 建立第一个数据库。一台机器上能够启动多个实例。
数据库 数据库是命名的对象集合,是与实例中的其余数据库分离的实体。一个 MySQL 实例中的全部数据库共享同一个系统编目。 数据库是命名的对象集合,每一个数据库是与其余数据库分离的实体。每一个数据库有本身的系统编目,可是全部数据库共享 pg_databases。
数据缓冲区 经过 innodb_buffer_pool_size 配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB 使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高能够设置为机器物理内存量的 80%。 Shared_buffers 缓存。在默认状况下分配 64 个缓冲区。默认的块大小是 8K。能够经过设置 postgresql.conf 文件中的 shared_buffers 参数来更新缓冲区缓存。
数据库链接 客户机使用 CONNECT 或 USE 语句链接数据库,这时要指定数据库名,还能够指定用户 id 和密码。使用角色管理数据库中的用户和用户组。 客户机使用 connect 语句链接数据库,这时要指定数据库名,还能够指定用户 id 和密码。使用角色管理数据库中的用户和用户组。
身份验证 MySQL 在数据库级管理身份验证。 基本只支持密码认证。 PostgreSQL 支持丰富的认证方法:信任认证、口令认证、Kerberos 认证、基于 Ident 的认证、LDAP 认证、PAM 认证
加密 能够在表级指定密码来对数据进行加密。还可使用 AES_ENCRYPT 和 AES_DECRYPT 函数对列数据进行加密和解密。能够经过 SSL 链接实现网络加密。 可使用 pgcrypto 库中的函数对列进行加密/解密。能够经过 SSL 链接实现网络加密。
审计 能够对 querylog 执行 grep。 能够在表上使用 PL/pgSQL 触发器来进行审计。
查询解释 使用 EXPLAIN 命令查看查询的解释计划。 使用 EXPLAIN 命令查看查询的解释计划。
备份、恢复和日志 InnoDB 使用写前(write-ahead)日志记录。支持在线和离线彻底备份以及崩溃和事务恢复。须要第三方软件才能支持热备份。 在数据目录的一个子目录中维护写前日志。支持在线和离线彻底备份以及崩溃、时间点和事务恢复。 能够支持热备份。
JDBC 驱动程序 能够从 参考资料 下载 JDBC 驱动程序。 能够从 参考资料 下载 JDBC 驱动程序。
表类型 取决于存储引擎。例如,NDB 存储引擎支持分区表,内存引擎支持内存表。 支持临时表、常规表以及范围和列表类型的分区表。不支持哈希分区表。 因为PostgreSQL的表分区是经过表继承和规则系统完成了,因此能够实现更复杂的分区方式。
索引类型 取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-树、哈希、R-树和 Gist 索引。
约束 支持主键、外键、唯一和非空约束。对检查约束进行解析,可是不强制实施。 支持主键、外键、唯1、非空和检查约束。
存储过程和用户定义函数 支持 CREATE PROCEDURE 和 CREATE FUNCTION 语句。存储过程能够用 SQL 和 C++ 编写。用户定义函数能够用 SQL、C 和 C++ 编写。 没有单独的存储过程,都是经过函数实现的。用户定义函数能够用 PL/pgSQL(专用的过程语言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 编写。
触发器 支持行前触发器、行后触发器和语句触发器,触发器语句用过程语言复合语句编写。 支持行前触发器、行后触发器和语句触发器,触发器过程用 C 编写。
系统配置文件 my.conf Postgresql.conf
数据库配置 my.conf Postgresql.conf
客户机链接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
数据访问和管理服务器 OPTIMIZE TABLE —— 回收未使用的空间并消除数据文件的碎片
myisamchk -analyze —— 更新查询优化器所使用的统计数据(MyISAM 存储引擎)
mysql —— 命令行工具
MySQL Administrator —— 客户机 GUI 工具
Vacuum —— 回收未使用的空间
Analyze —— 更新查询优化器所使用的统计数据
psql —— 命令行工具
pgAdmin —— 客户机 GUI 工具
并发控制 支持表级和行级锁。InnoDB 存储引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 语句在事务级设置隔离级别。 支持表级和行级锁。支持的 ANSI 隔离级别是 Read Committed(默认 —— 能看到查询启动时数据库的快照)和 Serialization(与 Repeatable Read 类似 —— 只能看到在事务启动以前提交的结果)。使用 SET TRANSACTION 语句在事务级设置隔离级别。使用 SET SESSION 在会话级进行设置。 



MySQL相对于PostgreSQL的劣势:
MySQL
PostgreSQL
最重要的引擎InnoDB很早就由Oracle公司控制。目前整个MySQL数据库都由Oracle控制。
BSD协议,没有被大公司垄断。
对复杂查询的处理较弱,查询优化器不够成熟
很强大的查询优化器,支持很复杂的查询处理。
只有一种表链接类型:嵌套循环链接(nested-loop),不支持排序-合并链接(sort-merge join)与散列链接(hash join)。
都支持
性能优化工具与度量信息不足

提供了一些性能视图,能够方便的看到发生在一个表和索引上的select、delete、update、insert统计信息,也能够看到cache命中率。网上有一个开源的pgstatspack工具。

InnoDB的表和索引都是按相同的方式存储。也就是说表都是索引组织表。这通常要求主键不能太长并且插入时的主键最好是按顺序递增,不然对性能有很大影响。html

不存在这个问题。python

大部分查询只能使用表上的单一索引;在某些状况下,会存在使用多个索引的查询,可是查询优化器一般会低估其成本,它们经常比表扫描还要慢。mysql

不存在这个问题
sql

表增长列,基本上是重建表和索引,会花很长时间。
数据库

表增长列,只是在数据字典中增长表定义,不会重建表
缓存

存储过程与触发器的功能有限。可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱
性能优化

除支持pl/pgsql写存储过程,还支持perl、python、Tcl类型的存储过程:pl/perl,pl/python,pl/tcl。
服务器

也支持用C语言写存储过程。
网络

不支持Sequence。并发

支持

不支持函数索引,只能在建立基于具体列的索引。

不支持物化视图。


支持函数索引,同时还支持部分数据索引,经过规则系统能够实现物化视图的功能。

执行计划并非全局共享的, 仅仅在链接内部是共享的。

执行计划共享

MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。



都 支持

不支持用户自定义类型或域(domain)

支持。

对于时间、日期、间隔等时间类型没有秒如下级别的存储类型

能够精确到秒如下。

身份验证功能是彻底内置的,不支持操做系统认证、PAM认证,不支持LDAP以及其它相似的外部身份验证功能。

支持OS认证、Kerberos 认证 、Ident 的认证、LDAP 认证、PAM 认证

不支持database link。有一种叫作Federated的存储引擎能够做为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙而且漏洞不少

有dblink,同时还有一个dbi-link的东西,能够链接到oracle和mysql上。

Mysql Cluster可能与你的想象有较大差别。开源的cluster软件较少。

复制(Replication)功能是异步的,而且有很大的局限性.例如,它是单线程的(single-threaded),所以一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master.

有丰富的开源cluster软件支持。

explain看执行计划的结果简单。

explain返回丰富的信息。

相似于ALTER TABLE或CREATE TABLE一类的操做都是非事务性的.它们会提交未提交的事务,而且不能回滚也不能作灾难恢复

DDL也是有事务的。






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的多版本的主要劣势在于:
   一、最新版本和历史版本不分离存储,致使清理老旧版本须要做更多的扫描,代价比较大,但通常的数据库都有高峰期,若是咱们合理安排VACUUM,这也不是很大的问题,并且在PostgreSQL9.0中VACUUM进一步被增强了。 
  二、因为索引中彻底没有版本信息,不能实现Coverage index scan,即查询只扫描索引,直接从索引中返回所需的属性,还须要访问表。而oracle与Innodb则能够; 


进程模式与线程模式的对比 
PostgreSQL和oracle是进程模式,MySQL是线程模式。 
进程模式对多CPU利用率比较高。 
进程模式共享数据须要用到共享内存,而线程模式数据自己就是在进程空间内都是共享的,不一样线程访问只须要控制好线程之间的同步。 
线程模式对资源消耗比较少。 
因此MySQL能支持远比oracle多的更多的链接。 
对于PostgreSQL的来讲,若是不使用链接池软件,也存在这个问题,但PostgreSQL中有优秀的链接池软件软件,如pgbouncer和pgpool,因此经过链接池也能够支持不少的链接。 

堆表与索引组织表的的对比

Oracle支持堆表,也支持索引组织表 
PostgreSQL只支持堆表,不支持索引组织表 
Innodb只支持索引组织表 
索引组织表的优点: 
表内的数据就是按索引的方式组织,数据是有序的,若是数据都是按主键来访问,那么访问数据比较快。而堆表,按主键访问数据时,是须要先按主键索引找到数据的物理位置。 
索引组织表的劣势: 
索引组织表中上再加其它的索引时,其它的索引记录的数据位置再也不是物理位置,而是主键值,因此对于索引组织表来讲,主键的值不能太大,不然占用的空间比较大。 
对于索引组织表来讲,若是每次在中间插入数据,可能会致使索引分裂,索引分裂会大大下降插入的性能。因此对于使用innodb来讲,咱们通常最好让主键是一个无心义的序列,这样插入每次都发生在最后,以免这个问题。 
因为索引组织表是按一个索引树,通常它访问数据块必须按数据块之间的关系进行访问,而不是按物理块的访问数据的,因此当作全表扫描时要比堆表慢不少,这可能在OLTP中不明显,但在数据仓库的应用中多是一个问题。 




  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中能够没必要建专门的降序索引了。
相关文章
相关标签/搜索