本帖最后由 osdba 于 2011-04-21 16:33 编辑 特性MySQL
PostgreSQL
实例
数据库数据缓冲区数据库连接⾝份验证加密
审计查询
使⽤ EXPLAIN 命令查看查询的解释计划。使⽤ EXPLAIN 命令查看查询的解释计划。解释备
份、InnoDB 使⽤写前(write-ahead)⽇志记录。⽀持在线
在数据⽬录的⼀个⼦⽬录中维护写前⽇志。⽀持在线和离线完全备份以及
恢复和离线完全备份以及崩溃和事务恢复。需要第三⽅软件
崩溃、时间点和事务恢复。 可以⽀持热备份。
和⽇才能⽀持热备份。志JDBC
驱动可以从 下载 JDBC 驱动程序。可以从 下载 JDBC 驱动程序。程序
⽀持临时表、常规表以及范围和列表类型的分区表。不⽀持哈希分区表。
表类取决于存储引擎。例如,NDB 存储引擎⽀持分区表,
由于PostgreSQL的表分区是通过表继承和规则系统完成了,所以可以实现
型内存引擎⽀持内存表。
更复杂的分区⽅式。
索引取决于存储引擎。MyISAM:BTREE,InnoDB:
⽀持 B-树、哈希、R-树和 Gist 索引。
类型BTREE。
⽀持主键、外键、惟⼀和⾮空约束。对检查约束进⾏解约束⽀持主键、外键、惟⼀、⾮空和检查约束。
析,但是不强制实施。存储过程
⽀持 CREATE PROCEDURE 和 CREATE没有单独的存储过程,都是通过函数实现的。⽤户定义函数可以⽤和⽤
FUNCTION 语句。存储过程可以⽤ SQL 和 C++ 编PL/pgSQL(专⽤的过程语⾔)、PL/Tcl、PL/Perl、PL/Python 、SQL 和户定
写。⽤户定义函数可以⽤ SQL、C 和 C++ 编写。C 编写。义函数
触发⽀持⾏前触发器、⾏后触发器和语句触发器,触发器语
⽀持⾏前触发器、⾏后触发器和语句触发器,触发器过程⽤ C 编写。
器句⽤过程语⾔复合语句编写。系统
配置my.confPostgresql.conf⽂件数据
库配my.confPostgresql.conf置客户
机连my.confpg_hba.conf接⽂件XML
有限的 XML ⽀持。有限的 XML ⽀持。⽀持
OPTIMIZE TABLE —— 回收未使⽤的空间并消除数据数据
通过执⾏ MySQL 命令(mysqld)启动实例。⼀个实例
通过执⾏ Postmaster 进程(pg_ctl)启动实例。⼀个实例可以管理⼀个或
可以管理⼀个或多个数据库。⼀台服务器可以运⾏多个
多个数据库,这些数据库组成⼀个集群。集群是磁盘上的⼀个区域,这个
mysqld 实例。⼀个实例管理器可以监视 mysqld 的各
区域在安装时初始化并由⼀个⽬录组成,所有数据都存储在这个⽬录中。
个实例。
使⽤ initdb 创建第⼀个数据库。⼀台机器上可以启动多个实例。
数据库是命名的对象集合,是与实例中的其他数据库分
数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个
离的实体。⼀个 MySQL 实例中的所有数据库共享同⼀
数据库有⾃⼰的系统编⽬,但是所有数据库共享 pg_databases。
个系统编⽬。
通过 innodb_buffer_pool_size 配置参数设置数据缓冲
区。这个参数是内存缓冲区的字节数,InnoDB 使⽤这Shared_buffers 缓存。在默认情况下分配 64 个缓冲区。默认的块⼤⼩是个缓冲区来缓存表的数据和索引。在专⽤的数据库服务8K。可以通过设置 postgresql.conf ⽂件中的 shared_buffers 参数来更新缓器上,这个参数最⾼可以设置为机器物理内存量的冲区缓存。80%。
客户机使⽤ CONNECT 或 USE 语句连接数据库,这
客户机使⽤ connect 语句连接数据库,这时要指定数据库名,还可以指定
时要指定数据库名,还可以指定⽤户 id 和密码。使⽤
⽤户 id 和密码。使⽤⾓⾊管理数据库中的⽤户和⽤户组。
⾓⾊管理数据库中的⽤户和⽤户组。
MySQL 在数据库级管理⾝份验证。 基本只⽀持密码认PostgreSQL ⽀持丰富的认证⽅法:信任认证、⼝令认证、Kerberos 认证。证、基于 Ident 的认证、LDAP 认证、PAM 认证可以在表级指定密码来对数据进⾏加密。还可以使⽤
可以使⽤ pgcrypto 库中的函数对列进⾏加密/解密。可以通过 SSL 连接实
AES_ENCRYPT 和 AES_DECRYPT 函数对列数据进
现⽹络加密。
⾏加密和解密。可以通过 SSL 连接实现⽹络加密。可以对 querylog 执⾏ grep。可以在表上使⽤ PL/pgSQL 触发器来进⾏审计。
数据访问和管理服务器
OPTIMIZE TABLE —— 回收未使⽤的空间并消除数据⽂件的碎⽚
myisamchk -analyze —— 更新查询优化器所使⽤的统计数据(MyISAM 存储引擎)mysql —— 命令⾏⼯具
MySQL Administrator —— 客户机 GUI ⼯具
Vacuum —— 回收未使⽤的空间
Analyze —— 更新查询优化器所使⽤的统计数据psql —— 命令⾏⼯具
pgAdmin —— 客户机 GUI ⼯具
⽀持表级和⾏级锁。⽀持的 ANSI 隔离级别是 Read Committed(默认 ——
⽀持表级和⾏级锁。InnoDB 存储引擎⽀持
能看到查询启动时数据库的快照)和 Serialization(与 Repeatable Read
READ_COMMITTED、READ_UNCOMMITTED、并发相似 —— 只能看到在事务启动之前提交的结果)。使⽤ SET
REPEATABLE_READ 和 SERIALIZABLE。使⽤ SET控制TRANSACTION 语句在事务级设置隔离级别。使⽤ SET SESSION 在会话
TRANSACTION ISOLATION LEVEL 语句在事务级设
级进⾏设置。
置隔离级别。
MySQL相对于PostgreSQL的劣势:MySQL
最重要的引擎InnoDB很早就由Oracle公司控制。⽬前整个MySQL数据库都由Oracle控制。
对复杂查询的处理较弱,查询优化器不够成熟
只有⼀种表连接类型:嵌套循环连接(nested-loop),不⽀持排序-合并连接(sort-merge join)与散列连接(hash join)。性能优化⼯具与度量信息不⾜
PostgreSQL
BSD协议,没有被⼤公司垄断。
很强⼤的查询优化器,⽀持很复杂的查询处理。都⽀持
提供了⼀些性能视图,可以⽅便的看到发⽣在⼀个表和索引上的select、delete、update、insert统计信息,也可以看到cache命中率。⽹上有⼀个开源的pgstatspack⼯具。
InnoDB的表和索引都是按相同的⽅式存储。也就是说表都是索引组织表。这⼀般要求主键不能太长⽽且插⼊时的主键最好是按顺序递增,否则对性能有很⼤影响。
⼤部分查询只能使⽤表上的单⼀索引;在某些情况下,会存在使⽤多个索引的查询,但是查询优化器通常会低估其成本,它们常常⽐表扫描还要慢。
表增加列,基本上是重建表和索引,会花很长时间。
表增加列,只是在数据字典中增加表定义,不会重建表除⽀持pl/pgsql写存储过程,还⽀持perl、python、Tcl类型的存
存储过程与触发器的功能有限。可⽤来编写存储过程、触发器、储过程:pl/perl,pl/python,pl/tcl。计划事件以及存储函数的语⾔功能较弱
也⽀持⽤C语⾔写存储过程。
不⽀持Sequence。
不⽀持函数索引,只能在创建基于具体列的索引。
⽀持函数索引,同时还⽀持部分数据索引,通过规则系统可以
不⽀持物化视图。
实现物化视图的功能。
⽀持
不存在这个问题不存在这个问题。
执⾏计划并不是全局共享的, 仅仅在连接内部是共享的。MySQL⽀持的SQL语法(ANSI SQL标准)的很⼩⼀部分。不⽀持递归查询、通⽤表表达式(Oracle的with 语句)或者窗⼝函数(分析函数)。
执⾏计划共享
都 ⽀持
不⽀持⽤户⾃定义类型或域(domain)
对于时间、⽇期、间隔等时间类型没有秒以下级别的存储类型⾝份验证功能是完全内置的,不⽀持操作系统认证、PAM认证,不⽀持LDAP以及其它类似的外部⾝份验证功能。
不⽀持database link。有⼀种叫做Federated的存储引擎可以作为⼀个中转将查询语句传递到远程服务器的⼀个表上,不过,它功能很粗糙并且漏洞很多
Mysql Cluster可能与你的想象有较⼤差异。开源的cluster软件较少。
⽀持。
可以精确到秒以下。
⽀持OS认证、Kerberos 认证 、Ident 的认证、LDAP 认证、PAM 认证
有dblink,同时还有⼀个dbi-link的东西,可以连接到oracle和mysql上。
少。
复制(Replication)功能是异步的,并且有很⼤的局限性.例如,它是单线程的(single-threaded),因此⼀个处理能⼒更强的Slave的恢复速度也很难跟上处理能⼒相对较慢的Master.
explain看执⾏计划的结果简单。
类似于ALTER TABLE或CREATE TABLE⼀类的操作都是⾮事务性的.它们会提交未提交的事务,并且不能回滚也不能做灾难恢复
explain返回丰富的信息。DDL也是有事务的。
有丰富的开源cluster软件⽀持。
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则可以;
进程模式与线程模式的对⽐
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中可以不必建专门的降序索引了。 原⽂地址:http://bbs.chinaunix.net/thread-1688208-1-1.html
因篇幅问题不能全部显示,请点此查看更多更全内容