# 概览
前面我们已经介绍过数据库内部的基本组件。现在,我们需要回到最高层。
数据库是一种能够轻松访问和修改的信息集合。但是,简单的文件也可以做相同的事情。事实上,最简单的数据库,比如 SQLite,就是一系列文件。但是,SQLite 是一组被精心组织的文件,允许你:
* 利用事务保证数据安全和一致
* 即使你处理百万级别的数据,它的处理速度依然很快
一般地,数据库可以看作下图:
[![](https://box.kancloud.cn/2016-04-26_571f700215176.png)](http://files.devbean.net/images/2016/03/global_overview.png)
在开始写这部分之前,我阅读了很多描述数据库的书和论文,甚至是数据库的源代码。所以,不要太纠结我是怎么组织数据库的,或者我是怎么给它命名的,因为我必须为了本书的主题做出一定的取舍。真正重要的是这些不同的组件。总的思想是,**数据库可以分为多个相互联系的多种组件**。
核心组件
* **进程管理器**:很多数据库都需要管理**进程池或线程池**。而且,为了改进那么几纳秒,一些现代数据库还会使用它们自己的线程,而不是操作系统提供的线程。
* **网络管理器**:网络 I/O 是个大问题,尤其对于分布式数据库。这也就是为什么有些数据库会有它们自己的网络管理器。
* **文件系统管理器**:**磁盘 I/O 是数据库的最大瓶颈**。因此,有一个能够完美地处理操作系统文件系统,甚至取代操作系统文件系统的文件系统管理器就变得非常重要。
* **内存管理器**:为了避免大量磁盘 I/O,大容量内存必不可少。但是,如果你有很大数量的内存,你就需要一个高效的内存管理器。尤其是当你在同一时间有多个查询时。
* **安全管理器**:管理用户的认证和授权。
* **客户端管理器**:管理客户端连接。
* …
工具
* **备份管理器**:保存和恢复数据库。
* **恢复管理器**:在数据库崩溃之后将其重启到一个**一致性状态**。
* **监控管理器**:记录数据库动作日志,提供工具监控数据库。
* **管理管理器**:保存元数据(比如表的名字和结构等),提供工具管理数据库、模式和表空间等。
* …
查询管理器
* **查询处理器**:检查查询语句属否合法。
* **查询重写器**:为查询语句预优化。
* **查询优化器**:优化查询语句。
* **查询执行器**:编译并执行查询语句。
数据管理器
* **事务管理器**:处理事务。
* **缓存管理器**:在使用数据之前或将数据写入磁盘之前,将数据放到内存中。
* **数据访问管理器**:访问磁盘上的数据。
本文剩下的部分,我将会详细阐述数据库是如何通过如下步骤管理一条 SQL 查询:
* 客户端管理器
* 查询管理其
* 数据管理器(这部分也会包括恢复管理器)