数据库对比

== 前言 ==
=== 起因 ===
一直在思索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的架构图
2 PostgreSQL的架构图
3 Oracle的架构图
或参见:
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
=== 图片 ===
=== 参考资源 ===