DB2,PostgreSQL & MySQL体系结构概述和对比
在 DB2、MySQL 和 PostgreSQL 之间有许多差异。我们先看看这三种数据库服务器在基本体系结构方面的一些差异和相似之处。
体系结构模型
MySQL 数据库服务器使用一种基于专用服务器线程的体系结构。
PostgreSQL 和 DB2 使用一种专用服务器进程模型体系结构。
存储引擎
MySQL 数据库使用可插入的存储引擎体系结构。
PostgreSQL 和 DB2 使用专用的存储引擎。
表空间模型
MySQL 对于 InnoDB 和 NDB 存储引擎使用表空间。
PostgreSQL 表空间可以跨越多个数据库。
DB2 表空间特定于一个数据库。
模式支持
PostgreSQL 和 DB2 具有真正的模式支持。
MySQL 不具有真正的模式支持。MySQL 中的模式可以被看作 MySQL 数据库。
数据库对象名是否是大小写敏感的
Linux 上的 MySQL 和 PostgreSQL 使用大小写敏感的数据库名、表名和列名。
所有平台上的 DB2 都使用大小写不敏感的名称。但是,DB2 只按照大写存储名称。
数组列
MySQL 和 DB2 不支持数组列。
PostgreSQL 支持数组列。
身份验证
DB2 使用各种外部安全机制来执行身份验证,比如操作系统、PAM、Kerberos、Active Directory、LDAP 等等。它还允许插入第三方安全模块。
PostgreSQL 按照许多不同方式之一执行身份验证。它可以使用数据库用户/角色、操作系统、PAM、Kerberos 等等,这取决于主机配置文件(pg_hba.conf)中的设置。
MySQL 在数据库级实现身份验证并对密码进行加密。
实例体系结构
DB2 实例管理不同的数据库,在同一台机器上可以有许多 DB2 实例。
PostgreSQL 的实例概念与数据库集群相似。
MySQL 实例与 DB2 数据库相似。
MySQL 和 PostgreSQL 数据库可以几乎每周都进行特性修改,但是 DB2 中的特性实现和修改要经过非常仔细的计划,这是因为有众多的业务依赖于使用 DB2 产品。请注意,在本文中我们使用 MySQL 5.1、PostgreSQL 8.0.3 和 DB2 V8.2 进行比较,所以在阅读本文时请考虑到这一点。
图 1、图 2 和 图 3 是 MySQL、PostgreSQL 和 DB2 的体系结构图。我们在阅读一些文档之后竭尽我们的能力绘制出 MySQL 和 PostgreSQL 的体系结构图。如果您发现不符合实际情况的地方,请告诉我们,我们会进行纠正。
MySQL
MySQL 使用一种基于线程的体系结构,而 PostgreSQL 和 DB2 采用基于进程的体系结构。正如在 图 1 中看到的,一个 MySQL 实例可以管理许多数据库。一个实例中的所有 MySQL 数据库共享一个公用的系统编目,INFORMATION_SCHEMA。
DB2 中的数据库是一个单独的实体,有自己的系统编目、表空间、缓冲池等等。DB2 实例管理不同的数据库,但是数据库并不共享表空间、日志、系统编目或临时表空间。
具有许多数据库的一个 MySQL 实例可以看作 DB2 中的一个数据库,而每个 MySQL 数据库相当于 DB2 中的一个模式。如果服务器上运行几个 MySQL 实例,每个实例管理几个数据库,那么可以采用以下迁移方式之一:
将每个 MySQL 实例迁移为同一 DB2 实例下的一个 DB2 数据库。
将每个 MySQL 实例迁移为只包含一个 DB2 数据库的 DB2 实例,并为每个 MySQL 数据库分配不同的模式。
注意: 当我们提到基于进程的体系结构时,指的是 UNIX® 平台,因为 Windows 上的模型是基于线程的体系结构。DB2 和 PostgreSQL 都是这样的。
在一个 DB2 连接的范围内只能访问一个数据库资源,而 MySQL 允许在同一个连接的范围内访问多个数据库资源。
MySQL 最有意思的特性之一是可插入的存储引擎。可以选择 MyISAM、InnoDB、Archive、Federated、Memory、Merge、Cluster、NDB 或 Custom 存储引擎。每个存储引擎具有不同的性质,可以根据自己的特定需求选择某一存储引擎。对于比较,我们发现 InnoDB 最接近于关系数据库。
图1. MySQL体系结构和进程概况
MySQL 服务器进程(mysqld)可以创建许多线程:
一个全局线程(每个服务器进程有一个)负责创建和管理每个用户连接线程。
为处理每个新的用户连接创建一个线程。
每个连接线程还执行身份验证和查询。
在 Windows 上,有一个命名管道处理器线程,它针对命名管道连接请求执行与连接线程相同的工作。
一个信号线程处理警报并迫使长时间空闲的连接超时。
分配一个线程来处理关闭事件。
有一些线程在复制期间处理主服务器和从服务器的同步。
使用线程处理表刷新、维护任务等等。
MySQL 使用数据缓存、记录缓存、键缓存、表缓存、主机名缓存和特权缓存来缓存和检索服务器进程中所有线程所使用的不同类型的数据。
另外,MySQL 主进程(mysqld)具有用来处理数据库管理活动的线程,比如备份、恢复、并发控制等等。
PostgreSQL
PostgreSQL 实例(见 图 2)可以管理一个数据库集群。每个数据库有自己的系统编目,INFORMATION_SCHEMA 和 pg_catalog。所有数据库共享 pg_databases 作为公用系统表。每个数据库是一个单独的实体,数据库的集合称为集群。一个 PostgreSQL 实例可以管理一个数据库集群。一台服务器可以运行多个实例。
在逻辑上,PostgreSQL 数据库可以迁移到 DB2 数据库。这两种数据库都支持模式对象类型。不能从命名的连接访问其他数据库。
PostgreSQL 和 DB2 之间最显著的差异与表空间相关。PostgreSQL 表空间可以跨越多个数据库,而 DB2 表空间特定于一个数据库。
图2. PostgreSQL体系结构和进程概况
PostgreSQL 会话由几个主进程组成:
postmaster 进程是一个主管进程,它生成其他进程并监听用户连接。
用户进程(比如 psql)用来处理交互式 SQL 查询。
postmaster 生成一个或多个名为 postgres 的服务器进程来处理用户的数据请求。
服务器进程通过信号量和共享内存来相互通信。
DB2
图 3 显示 DB2 的体系结构。这张图解释了 DB2 如何使用缓冲池在磁盘之间处理数据(文件、原始设备、目录等等)。DB2 使用一个连接集中器来处理大量连接。DB2 页清理器和预获取器异步地工作,各个进程单独处理重做日志活动。关于 DB2 中锁和进程的工作方式的详细描述,请参见 参考资料。
图3. DB2体系结构和进程概况
DB2 会话由几个进程组成:
MySQL、PostgreSQL和DB2之间有什么差异?
MySQL 使用基于线程的体系结构模型,而 PostgreSQL 和 DB2 使用基于进程的体系结构模型。
DB2 可以在一台服务器上有多个实例。每个实例中可以有许多数据库。每个数据库与其他数据库在物理上和逻辑上隔离。
MySQL 可以在一台服务器上运行多个 mysqld 实例。每个实例可以管理一个或多个 MySQL 数据库。一个实例中的每个数据库并不在物理上或逻辑上隔离。MySQL 中的每个数据库可以被看作 DB2 中的模式。
可以认为 PostgreSQL 数据库集群相当于 DB2 实例。
db2sysc,主 DB2 系统控制器,即引擎进程。
监听器进程,比如 db2tcpcm 和 db2ipccm,它们监听用户的连接请求。
一个或多个代表应用程序工作的代理。代理有两种类型:
db2agent 代表一个应用程序工作,并使用进程间通信或远程通信协议与其他代理通信。
db2agntp 用来在打开内部并行的情况下满足对数据库的客户机请求。
用户的进程(比如 db2)用来处理来自命令行的交互式查询。
db2bp —— 一个持久的后台进程,用于 DB2 Command Line Processor(CLP)。
db2disp —— 一个代理调度器进程,在启用连接集中器的情况下用于将连接分配给可用的协作代理。
db2fmcd —— 每个服务器的故障监视器协作守护进程。
db2fmd —— 每个实例的故障监视器守护进程。
db2resyn —— 一个重新同步管理器进程,用于处理两阶段提交。
db2dlock —— 一个 DB2 死锁探测器。
db2loggr —— 数据库日志读取器。
db2loggw —— 数据库日志写入器。
db2pclnr —— 缓冲池页清理器。
db2pfchr —— 缓冲池预获取器。
db2fmp —— 用于在服务器上 DB2 地址空间之外运行用户代码。
等等
DB2 服务器进程通过称为数据库管理器内存(Database Manager Memory)和数据库共享内存(Database Shared Memory)的内存区域相互通信,见 图 4。
图4. DB2数据库管理器(实例)和数据库共享内存体系结构
特性对比
表 1 对比了 MySQL、PostgreSQL 和 DB2 特性。这不是一个完整的列表,但是对比了最常用的特性。
表1. MySQL、PostgreSQL和DB2特性对比