数据库对比

From PostgreSQL wiki
Jump to navigationJump to search

前言

起因

一直在思索MySQL成功的原因,所以向一些业界的朋友请教探讨,得出一点极为简单的东西如下:

总结:

MySQL的成功是随同互联网成长、LAMP成长、MySQL的DBA成长而成长的(功能逐步完善),它突出的特点是:因简单而易用/免费/开源/因插件框架而易扩展/复制功能领先/性能好。

1 因简单而易用: 解决了新人快速上手的需求(入门问题)

2 免费: 解决了平民也要使用数据库的需求(资金问题)

3 开源: 解决了深度探索的需求(闭源恐惧问题)

4 因插件框架而易扩展: 解决了未来发展的需求(发展问题)

5 复制功能领先: 解决了DBA以简单方式保证数据可靠的需求(维护问题)

6 性能好:够用而不掉链(可用问题)

再总结:平民化


这些内容简单还不足以说明问题,许多朋友也关心数据库选型的问题,所以作个深度的剖析,通过对PostgreSQL/MySQL/Oracle分析,以此达到:

1 客观性:只做比较不做评述,保持客观公正的立场。

2 全面性:从历史/技术/服务/运维/应用/市场/未来等角度做比较,其中技术是重点。

3 多角度:面对目前的版本,从技术实现/使用方式等角度去比较,前者是从代码的角度看问题,后者是从用户的角度看问题,使得本文力求更为“客观+全面”。

约定

数据库版本约定

1 MySQL V5.6.x及以上,如果有特殊需要,可单独标明版本。

2 PostgreSQL V9.2.x及以上,如果有特殊需要,可单独标明版本。

3 Oracle V12c及以上,如果有特殊需要,可单独标明版本。

历史

数据库技术简史

Oracle数据库简史

PostgreSQL数据库简史

MySQL数据库简史

技术

概述

产品形态与组件组成

架构图

1 MySQL的架构图

MySQL架构.jpg

2 PostgreSQL的架构图

PostgreSQL架构.jpg

3 Oracle的架构图

Oracle架构.png

或参见: http://blog.163.com/li_hx/blog/static/1839914132014426115250298/

基本架构
1 多进程/多线程架构

MySQL是多线程结构。PostgreSQL是多进程结构。Oracle和平台有关,可认为是多进程/多线程共用的结构。

1.在UNIX平台上,Oracle/PostgreSQL使用多进程模式;MySQL使用单进程多线程模式。

2.在Windows平台上,Oracle/MySQL使用多线程模式, PostgreSQL用多进程模式。

3.Oracle采用独立的监听进程监听用户的连接请求

4.PostgreSQL采用主进程作为监听用户连接请求

5.MySQL采用主线程作为监听用户连接请求

在后台进程或线程方面:

1. Oracle后台进程包括:数据库写进程Database Writer (DBW0 or DBWn)、日志写进程Log Writer (LGWR)、检查点进程Checkpoint (CKPT)、系统监视器进程System Monitor (SMON)、进程监视器进程Process Monitor (PMON)、归档进程Archiver (ARCn)、恢复进程Recoverer (RECO)、锁管理器进程Lock (LCK0)、队列管理器进程Job Queue (SNPn)、队列监视器进程Queue Monitor (QMNn)、调度器进程Dispatcher (Dnnn)、服务器进程Server (Snnn)。

2. PostgreSQL后台线程包含:主服务进程、系统恢复进程、系统写进程、写日志进程、数据库统计进程、空间清理进程、归档进程、输出信息写进程、流复制进程。

3. MySQL(以InnoDB为默认的存储引擎)后台线程包含: 主线程、 脏页刷出线程、事务回滚线程、IO线程(参数确定,可能有多个)锁超时监控线程(解决死锁)、错误监控线程、InnoDB监控线程(打印输出InnoDB监控信息)、缓存刷出的线程(参数确定,可能有多个)、执行purage协调操作的线程、执行purge执行操作的线程(参数确定,可能有多个)、缓存池加载与导出线程、词典统计收集信息线程、全文检索服务线程、 全文检索并行排序线程(参数确定,可能有多个)、性能监控线程(PFS)、复制相关线程等。


  三者的主要差异:PostgreSQL比Oracle多出: 数据库统计进程、空间清理进程、输出信息写进程、流复制线进。比Oracle缺少:系统监视器进程、锁管理进程、队列管理器进程、队列监视器进程、调度器进程。
  PostgreSQL对每一个客户连接,产生一个相应服务线程。和客户端是一对一关系。
  Oracle根据连接方式的不同,产生专用服务器进程或共享服务器进程。其中,专用服务器进程和客户端是一对一关系,共享服务器进程可以是一对多关系。此外,在共享服务器进程存在前提下,还将有一个数据库调度器进程负责任务分派。
2 内存管理方式

1. PostgreSQL,启动过程中,通过参数shared_buffers从操作系统分配一块内存,作为数据页面缓存,这是Pg对内存的自管理方式。之后,数据库运行期间,所需的内存(如数据页的缓存/日至页的缓存/排序和连接运算使用的缓存/锁使用的内存/临时使用的内存),从进程的全局堆中分配。 这块内存,大小不可在运行期间改变,这是一个弊端。


可参考:

http://blog.163.com/li_hx/blog/static/183991413201162723517837/?suggestedreading&wumii

2. Oracle,启动过程中,通过一些参数的控制,从操作系统分配内存,主要是PGA和SGA。 PGA,Program Global Area,程序全局区,是服务器进程(Server Process)使用的一块包含“数据和控制信息”的内存区域,PGA是非共享的内存,在服务器进程启动或创建时分配,并为Server Process排他访问。 SGA,System Global Area,系统全局区,用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,在数据库实例启动时分配,当实例关闭时释放,每个实例都有自己的SGA区。


可参考:

http://geeksun.iteye.com/blog/549815

或:

http://blog.csdn.net/xmallwood/article/details/8981692

http://blog.csdn.net/xmallwood/article/details/8981725


3. MySQL,启动过程中,通过一些参数的控制,从操作系统分配内存供系统的一些信息使用,但对于数据缓存(最主要的缓存),却不是以统一方式管理的,这点和PG/Oracle等数据库非常不同。MySQL通过join buffer提供对所需数据的读写管理。


可参考:

http://wenku.baidu.com/link?url=z8nOsxn_C9nWGWM88DLqOm9xUavnXZekS_bfLbWwoJE3rVKakSeGiYwzMVd_vaJGEZIXAp2vN04wOVYYgI7fDJPVl2BeRgKAXH9XWdEE6LG

产品特性

1 一些产品功能特性的对比,参考:

http://wenku.baidu.com/link?url=bFC6bA3MdWyYlrYLTAjCqE576Yy6Wwt8ekJY7MsaWmliwMsIkujDoGMoaTMIR4KZAmIelbxHMi5_BN8Jxo1frfPWCHt-S88tDdgmvg6Hx1_

http://bbs.chinaunix.net/thread-1688208-1-1.html

2


MySQL的产品特性
Oracle的产品特性
PostgreSQL的产品特性

PostgreSQL具有以下主要产品特性:

1 标准通用:实用、高效的通用数据库管理系统

PostgreSQL 基于广泛应用的关系数据模型,遵循SQL国际标准。 PostgreSQL 经过大量实际应用的磨合与验证,已成为标准、通用、安全、稳定、实用、高效的数据存储与管理平台。

2 简便易用:图形化交互式管理工具

PostgreSQL 提供了多种图形化交互管理工具,用于对数据库进行方便、高效的管理,如PostgreSQL Manager,phpPgAdmin等。

3 海量存储:强大的大规模数据存储与管理能力

PostgreSQL 结合结构化查询语言的操作能力和过程化语言的数据处理能力,可以有效地支持大规模数据存储与存取,如TB级的数据库的表空间、GB 级的 BLOB 二进制大对象和 CLOB 文本大对象等,并通过各种约束保证数据的完整性和安全性。

4 数据安全:较高的安全性

为应对数据安全保护需求,PostgreSQL V6通过身份鉴别、系统权限、对象权限(表级q权限、列级权限)、用户权限,以及数据访问、传输(利用SSL)等方面的安全性增强提高了数据库系统的整体安全性,可以在一定程度上应对多样的数据安全管理的业务场景,保障数据的安全(但数据的安全,最大的威胁依旧是操作系统)。

5 跨越平台:平台无关性,适用于不同操作系统

PostgreSQL 服务器内核可跨越平台运行在 Windows、Linux、UNIX 等操作系统之上。

6 标准接口:标准化应用接口

PostgreSQL 为应用开发提供了符合标准的 ODBC 3.0、JDBC 3.0、OLEDB 2.7和嵌入式 SQL 接口,应用软件开发者可使用常用的各种开发工具,通过这些接口,进行复杂的商业应用开发。PostgreSQL 服务器端的服务进程与客户端应用通过标准的TCP/IP接口通信。SQL语言符合SQL:1992标准的入门级和过渡级,SQL:1999和SQL:2003的核心级。

7 支持数据库核心功能。

7.1 真正的事务型数据库,完全支持ACID四大特性。

7.2 数据库完整性支持良好,主外键特性完善(实体完整性,参照完整性)。约束特性完善(用户自定义完整性)。

7.3 用户可定义的对象类型丰富。包括:数据库,模式,表,视图,索引,各种约束(NOT NULL/主外键/CHECK),触发器,储存过程,用户自定义函数。丰富的数据类型。

7.4 用户可定义内存空间。数据缓存区的管理(设置share_buffer变量)。

7.5 存储:用户可定义存储位置,但表空间的管理方式有待继续完善(适用到V9.4)。可参见:

PostgreSQL的数据存储---目录 http://blog.163.com/li_hx/blog/static/183991413201172483824324/

PostgreSQL 和 MySQL 存储层深度解析 http://wenku.baidu.com/link?url=7lhpBejDLB4KfR8VrliKNexGtIGtLd4dNsXpcpZNDTW44OMivT1eKiuvgZmN9lROUPn0rBUr5nYrwLrv3vowzacgEevW4scvWZqmTMlDivu

7.6 并发的支持:MVCC实现并发读不冲突。各种锁(自旋锁,轻量锁,锁)和各种对象的不同级别的锁(读锁,写锁,意向锁)的实现保护了竞争的相同资源。

7.7 查询优化技术的支持。高效的查询优化器和执行器,保证了查询执行的效率。 参见: 《数据库技术丛书·数据库查询优化器的艺术:原理解析与SQL性能优化》 http://blog.163.com/li_hx/blog/static/183991413201401343151445/

数据库基本概念

数据库服务器的实例结构

数据库对象

数据库完整性约束

数据库的用户和权限

存储结构

事务管理

安全机制

高可靠管理

逻辑备份还原

归档与物理备份恢复

复制与Standby

SQL基础

SQL的语法基础

伪列

数据类型

操作符

表达式

函数

SQL语句

模式管理

用户权限管理

查询语句

数据更新

事务处理

保存点

预编译

参数设置

远程连接对象

物理联机全系统备份

查看SQL执行计划

存储模块(PL/SQL语言)

存储过程

用户自定义函数

触发器

匿名块

接口驱动程序

JDBC

ODBC

其他

外围管理与辅助工具

连接池

1 PostgreSQL提供连接池的功能

http://www.craigkerstiens.com/2014/05/22/on-connection-pooling/

可用的组件主要有:

1.1 PG Bouncer(http://pgfoundry.org/projects/pgbouncer)

1.2 PG Pool(http://www.pgpool.net/mediawiki/index.php/Main_Page)

相关项目

其他能力

跨平台能力

MySQL、PostgreSQL、Oracle都支持多种平台,这是一种软件的兼容能力,主要包括2个方面,一是向上兼容,二是向下兼容,这样才能构成完整的软件生态链:

一 向上兼容,通常指的是软件的支持

1 编程语言:

 支持编程语言访问数据库,如支持Java使用JDBC访问数据库,支持C/C++使用ODBC访问数据库.
 MySQL、PostgreSQL、Oracle都支持多种数据库驱动程序来访问数据库。

2 中间件:

 典型如Tomcat、Weblogic等中间件,通常需要和数据库密切配合,实现一些特定的高效的功能。

二 向下兼容,通常指的是软件的依赖

1 硬件平台:

 支持各种架构的CPU。

2 操作系统平台

 支持各种操作系统。

数据库操作系统支持对比表(继续增加操作系统)

对比项 MySQL(5.6) PostgreSQL(9.3.x) Oracle(12c)
Windows XP 32-bits Y Y Y
Windows 7 64-bits Y Y Y
Unix Y Y Y
Free BSD Y
Debian Y


JSON支持能力

MySQL、PostgreSQL都对JSON提供了支持,用以对Key-Value式的应用提供支持。

PostgreSQL另外提供了更高效率的JSONB数据类型,以支持JSON。


其支持的粒度,可以参见:

1 MySQL and PostgreSQL JSON functions: do they differ much? https://blogs.oracle.com/svetasmirnova/entry/mysql_and_postgresql_json_functions

半新技术

集群

内存数据库

新技术

XX

XX

服务

运维

应用

市场

未来

从licence比

社区发展模式

附录

编写人员

那海蓝蓝

网名:那海蓝蓝。

博客:http://blog.163.com/li_hx/

微博:http://weibo.com/3181484461

邮箱:database_XX@126.com

图片

参考资源