上一页 首页

PostgreSQL 对 MySQL: 没有偏见的比较

  PostgreSQL MySQL
SQL标准兼容性 Postgres 支持SQL92的一个通用的子集;而且也支持这个子集的一个超集 — Postgres 在这个子集中加入了一些面向对象的特性。开发组正在实现外部连接(OUTER JOIN)。 MySQL 支持SQL92的一个子集,但是缺乏一些重要的特性 — 例如子查询。
速度 Postgres 有一些慢,但是有许多方法来提高它的执行速度 — 从使用 -F 选项到用Postgres优化过的查询语句重写程序 — 可以使用不同的优化设置(“SET KSQ", "SET GEQO")来进行优化。Postgres 对于每个连接都生成一个子进程 — 而这些生成子进程并建立后台服务进程的步骤减慢了 Postgres 的执行速度。 MySQL 在进行简单的 SELECT 查询时速度非常快,但如果执行那些稍微有点儿复杂的查询,速度就会下降很多。MySQL 在处理客户端连接时速度非常快,因此MySQL 很适合于 Web 应用 — 如果你需要同时处理上百个的CGI的连接/断开请求,你会很高兴避免较长时间的启动处理程序的过程。
稳定性 Postgres 在这方面表现很差。偶尔的连接中断,服务程序崩溃和内存泄漏是常有的事。当然,6.5版本的表现要比6.4版本好得多,我希望7.0版本能比6.5 版本更好,但是...
为了能够处理更多的同时的连接,你需要使用特殊的选项对 Postgres 进行重新编译 — 将后台进程的数目设为最大。Tom Lane (注:PostgreSQL 的主要开发者之一。)说过:“没有经过重新编译的 6.5 版本的 Postgres 最多能够支持1024个后台进程。如果你要搭建一个负荷很大的能够支持更多后台进程数目的数据库平台,那么你必须增大 MAXBACKENDS 的设置然后重新编译。但是相对于 postmaster 运行时最大后台进程数目这个限制,编译时最大后台进程数目的限制是建立更多后台进程的更大的障碍。
即使在我的站点工作最繁忙的时候,MySQL仍然工作得很好;在每秒处理成百个连接时,它当然会有一些问题,但这些问题是可以解决的— MySQL 有很多的调整选项。偶尔的连接中断和程序崩溃很罕见;我也从不需要使用备份来恢复数据。
数据完整性 Postgres 有事务的提交/撤销的特性;它的开发小组正在实现外部键(FOREIGN KEY)特性和其他实现数据完整性的特性。 MySQL不支持有关数据完整性的任何特性。
特别的服务器端的特性 Postgres 支持规则,触发器以及用C,pl/pgsql,perl和tcl语言编写的服务器接 口函数。 MySQL只提供用C语言实现服务器共享函数库这种机制(可能使用上还不太方便)。
安全性 Postgres 有类似的安全特性,但离完美还差一点点。例如,如果用户能够连接到数据库,他(她)就能够建立表,因此可以进行拒绝服务攻击(DOS)。另外Postgres能够使用不同的标准-网络地址段,ident认证字等来限定登录的用户。 MySQL对用户访问的控制非常棒。你可以基于用户名、表名和客户机名任意授予(GRANT)或废除(REVOKE)权限。
锁定和并行的支持 PostgreSQL 有一个称为 MVCC(多版本并行控制)的并行处理机制,它可以媲美甚至好于最好的商业数据库。PostgreSQL 能进行行一级的锁定,能够在一个会话中锁定一些行进行(执行)写操作,而不影响其他会话对这些行的操作等等。 MySQL只能锁定表来执行(并行的)读或写。
大对象 在 Postgres 中,大对象是一种很特殊的东西。你必须用 lo_create 函数建立大对象并将函数的返回结果 — 即OID(注:对象标识),存到表中。然后你可以根据 OID 使用其他一些函数 — lo_read/lo_write 等来处理 LOB 对象。Postgres也有一些地方不支持大对象 — pg_dump 不能将 LOB 对象输出到脚本中;你必须建立你自己的备份机制实现大对象的备份。开发小组正在实现大的行(large rows);这将取代目前的 LOB。 在 MySQL 中,文本的和二进制的 LOB 对象只是表中的域。在执行插入、替换、选择和删除时,它象你希望的那样工作 — 没什么特别之处。在函数中使用大对象和用大对象建立索引时会有一些限制。
修改表 Postgres 支持一定程度上的对表的修改。你可以添加列,对列重命名,对表重命名。 MySQL 具有修改表的所有选项 — 你能够任意添加列,删除列,对列重命名或更改列的类型 — (对于)在繁忙的服务器上,当你不想锁住整个数据库然后备份、更改类型定义,再装回去的时候,这些特性很有用。
本地语言支持 使用 --enable-locale 选项编译的 Postgres 进行了一些本地化的设置,它能改变每个客户端(不是每个数据库)的本地化设置,这使得使用上比较灵活。用--with-mb(多字节支持)编译的 Postgres 可以在运行时在一些预先定义好的字符集之间进行转换。 MySQL在本地化设置上做了一些工作,但不多。
Postgres和MySQL都还需要在日期/时间解析/生成的本地化上继续努力。它们都不能够处理多字符集的数据库。

上一页 首页