MySQL
我们通常所说的 MySQL 数据库服务器由一个实例(instance)以及一个数据库(database)组成。实例包括一组后台进程/线程和许多内存结构,用于管理数据库;数据库由一组磁盘文件组成,用于存储数据和日志等信息。
MySQL 使用典型的客户端/服务器(Client/Server)结构,逻辑结构图如下所示:
MySQL 体系结构大体可以分为三层:客户端、服务器层以及存储引擎层。其中,服务器层又包括了连接管理、查询缓存 、SQL 接口、解析器、优化器、缓冲与缓存以及各种管理工具与服务等。
具体来说,每个组件的作用如下:
- 客户端,连接 MySQL 服务器的各种工具和应用程序。例如 mysql 命令行工具、mysqladmin 以及各种驱动程序等。
- 连接管理,负责监听和管理客户端的连接以及线程处理等。每一个连接到 MySQL 服务器的请求都会被分配一个连接线程。连接线程负责与客户端的通信,接受客户端发送的命令并且返回服务器处理的结果。
查询缓存 ,用于将执行过的 SELECT 语句和结果缓存在内存中。每次执行查询之前判断是否命中缓存,如果命中直接返回缓存的结果。缓存命中需要满足许多条件,SQL 语句完全相同,上下文环境相同等。实际上除非是只读应用,查询缓存的失效频率非常高,任何对表的修改都会导致缓存失效;因此,查询缓存在 MySQL 8.0 中已经被删除。- SQL 接口,接收客户端发送的各种 DML和 DDL 命令,并且返回用户查询的结果。另外还包括所有的内置函数(日期、时间、数学以及加密函数)和跨存储引擎的功能,例如存储过程、触发器、视图等。
- 解析器,对 SQL 语句进行解析,例如语义和语法的分析和检查,以及对象访问权限检查等。
- 优化器,利用数据库的统计信息决定 SQL 语句的最佳执行方式。使用索引还是全表扫描的方式访问单个表,多表连接的实现方式等。优化器是决定查询性能的关键组件,而数据库的统计信息是优化器判断的基础。
- 缓存与缓冲,由一系列缓存组成的,例如数据缓存、索引缓存以及对象权限缓存等。对于已经访问过的磁盘数据,在缓冲区中进行缓存;下次访问时可以直接读取内存中的数据,从而减少磁盘 IO。
- 存储引擎,存储引擎是对底层物理数据执行实际操作的组件,为服务器层提供各种操作数据的 API。MySQL 支持插件式的存储引擎,包括 InnoDB、MyISAM、Memory 等。
- 管理工具,MySQL 提供的系统管理和控制工具,例如备份与恢复、复制、集群等。
💡MySQL 体系结构的详细介绍可以参考这篇文章。
Oracle
一个 Oracle 数据库服务器(database server)由一个数据库(database)以及至少一个数据库实例(database instance,通常简称实例)组成。正是由于实例和数据库之间的关系如此紧密,Oracle database 有时候同时表示实例和数据库。
严格来说,这些术语的意义如下:
- 数据库(Database),数据库代表磁盘上的一组文件,用于存储数据。这些文件可以独立于实例而存在。
- 数据库实例(Database instance),实例是一组内存结构,用于管理数据库文件。实例由一个称为系统全局区(SGA)的共享内存区域以及一组后台进程组成。实例可以独立于数据库文件而存在。
上图显示了一个数据库和它的实例。对于每个连接到实例的用户连接,客户端进程负责运行应用程序。每个客户端进程与自己的服务器进程关联。服务器进程拥有自己的私有会话内存,称为程序全局区(PGA)。
图中 SGA 包括数据库缓冲区高速缓存(Database Buffer Cache)、重做日志缓冲区(Redo Log Buffer)、共享池(Shared Pool)、大池(Large Pool)、固定 SGA(Fixed SGA)、Java 池(Java Pool)以及流池(Streams Pool)。SGA 右边是后台进程:PMON、SMON、RECO、MMON、MMNL 等。SGA 下边也是后台进程:DBWn、CKPT、LGWR、ARCn 以及 RVWR。再往下是 PGA 和服务器进程。服务器进程和客户端进程相互连接。客户端进程右边是数据库文件(数据文件、控制文件以及在线重做日志)、归档重做日志以及闪回日志。
💡Oracle 数据库体系结构的详细介绍可以参考这篇文章。
Microsoft SQL Server
Microsoft SQL Server 服务由一个实例(Instance)和多个数据库(Databases)组成,实例包含了后台线程和占用的内存,默认的系统数据库包括 master、model、msdb、Resource 以及 tempdb。
Microsoft SQL Server 的整体系统结构如下:
主要包含以下三个组件:
- 协议层(Protocol Layer),主要负责客户端的连接请求和数据通信。
- 关系引擎(Relational Engine),主要负责 SQL 语句的解析、优化和执行。
- 存储引擎(Storage Engine),主要负责数据和日志的存储和访问、内存和缓存管理、事务和锁管理。
💡Microsoft SQL Server 数据库体系结构的详细介绍可以参考这篇文章。
PostgreSQL
PostgreSQL 数据库系统由实例(Instance)和物理数据库集群(Database Cluster)组成。
- 实例(Instance),由 PostgreSQL 后台进程和相关的内存组成。启动服务器进程时创建一个实例,关闭服务器进程时实例随之关闭。
- 数据库集群,每个 PostgreSQL 实例管理的都是一个数据库集群,它可以包含多个数据库。注意,这里的集群不是多台服务器组成的集群。
- 数据库(Database),一个数据库由一组相关的对象组成,例如表、索引、视图、存储过程等等。
- 模式(Schema),数据库中的对象使用模式进行组织。准确地说,一个数据库由多个模式组成,模式由许多对象组成。
- 表空间(Tablespace),在 PostgreSQL 中,数据库对象(例如表)在文件系统中对应的是文件,表空间指定了这些文件存储的目录。创建数据库对象时,只需要指定存储对象的表空间的名称(或者使用默认值),而不需要指定磁盘上的物理路径。
这篇文章可以学习更多的 PostgreSQL 知识。
SQLite
SQLite 是一个嵌入到应用程序中的数据库引擎,没有服务端,没有单独管理数据库的服务器进程。应用程序通过函数调用和数据库引擎进程交互,而不是将消息发送给单独的进程或线程。
客户端/服务器数据库对于现代应用系统非常重要,它们专注于可伸缩性、并发性、集中管理和控制等,解决了企业数据的共享存储问题。 SQLite 则致力于为单个应用程序和设备提供本地数据存储,强调的是经济、效率、可靠性、独立性和简单性。