数据库概览
·数据库不是简单的一堆文件叠加整理在一起,而是有多个组件相互合作而成。忽略具体某种数据库,一般数据库由以下组件构成:
Fig. 8
核心组件:
进程管理器:很多数据库需要许多进程/线程同时都运行,所以搞了一个进程/线程池来管理这些进程/线程。 比如,有些数据库为了得到纳秒( nanoseconds) 信息,不直接使用操作系统的线程,而是通过自己创建的线程来实现。
网络管理器:网络 I/O 是一个大问题,尤其是分布式数据库。 所以,许多数据库有自己的网络管理器。
文件系统管理器: 磁盘 I/O 是数据库的最常见的瓶颈所在。 数据库有自己的文件系统管理器,可以更好的解决数据库与操作系统的文件系统之间数据交换, 甚至替换操作习惯的文件系统。
内存管理器: 为了避免磁盘 I/O 的效率低下的问题,大量的内存的使用肯定很有价值。但是,如果操作大量内存时,必须一个独立的高效的内存管理器。特别是, 同一时间有很多查询都在存取内存时,显得尤为必要。
安全管理器: 用户身份的鉴定和权限管理。
客户端管理器: 管理多个客户端连接。
工具:
备份管理器: 备份和恢复一个数据库
恢复管理器: 数据库发生崩溃后重启,需要把数据库的所有数据做到一致状态
监控管理器: 使用 log 记录数据库的所有行为,并且提供工具和信息用以监控数据库
Administration manager:恢复数据库的原数据( 比如某个表的表名和结构),提供工具和信息用以管理数据库、 Schemas(模式) 和表空间
数据管理器:
事务管理器:处理事务
Cache 管理器: 在数据被使用前先加载到内存,保存将要写入数据库的数据
数据存取管理器: 存取磁盘上的数据
查询管理器:
查询解析: 检查一个查询是否有效
查询重写: 预优化一个查询
查询优化: 优化一个查询
查询执行: 编译以及执行一个查询
现在回到最初的问题,即:数据库是如何处理一个 SQL 查询的,从客户端管理器->查询管理器->事务管理器三个部分来解释改问题。
客户端管理器:
数据库的客户端管理器,负责处理来自客户的连接。客户,可以是一个服务器,或 Web 服务器, 或者一个终端用户和终端软件。 客户端管理器实现了各种不同的访问数据库的接口,比如众所周知的: JDBC, ODBC, OLE-DB,以及其他专用数据库接口。
Fig. 9
当客户端连接数据库:
- 检查用户登陆验证信息(账号和密码),以及检查用户是否有访问数据库权限;
- 检查是否有空余线程/进程处理该连接;
- 检查数据库负载如何(是否过重);
- 如果连接需要等待,当超过等待时间,将返回可读的错误提示;
- 如果连接可用,查询将传递给查询管理器
- 由于查询处理是一个"all or noting"过程,故当查询到数据后,查询结果将部分存入缓存并开始发送给客户端。
-
客户端连接意外断开时,会收到可读接受,并释放连接的资源。