基本组件(前4节)
我们刚介绍的是数据库内部的基本原理
数据库是一个可以轻松访问和修改的**信息的集合*。 但是一堆简单的文件也可以做到这一点。 实际上,最简单的数据库(如SQLite)仅是一堆文件。 但是SQLite是精心设计的一堆文件因为它可以: - 使用事务去确保数据安全和交易连续性 - 快速处理数据,即使是几百万行数据
通俗来说,数据库可以如下图所示
在写这部分前,我看了很多书和论文,不同的数据库对基础组件的称呼不同.所以不要关注我是怎么组织数据库理念的,也不要关注我是怎么给这些处理过程命名的.因为这篇文章的需要我做了一些取舍.忽略这些组件的差异;总的思路是将整个数据库系统分成以下几个组件:
核心组件:
- 进程管理器 : 很多数据库有个*进程/线程*池需要处理.此外,为了获得纳秒级的性能,某些现代数据库使用自己的线程管理而不是操作系统线程管理。
- 网络管理器 : 网络I/O是一个关键点,尤其是对于分布式数据库。 这就是为什么某些数据库拥有自己的管理器的原因
- 文件管理器 : 磁盘I/O是数据库最大(或者说是每一位)的瓶劲.拥有一个自身的文件管理理可以很好的的适配或替代操作系统文件管理器
- 内存管理器 : 为了避免磁盘I/O需要大量的内存.处理大量的内存你需要一个高效的内存管理器,尤其是你有很多查询同时用到内存的情况下
- 安全管理器 : 用于管理用户的身份验证和授权
- 客户端管理器 : 用于管理客户端的连接
- ……
工具:
- 备份管理器 : 用于保存和还原数据库。。
- 恢复管理器 : 崩溃后以一致状态重新启动数据库
- 监视管理器 : 用于记录数据库的活动并提供监视数据库的工具
- 后台管理器 : 用于存储元数据(如表的名称和结构),并提供工具来管理数据库,模式,表空间,…
- ……
查询管理器:
- 查询解析器 :检查查询是否有效
- 查询重写器 :预优化查询
- 查询优化器 :优化查询
- 查询执行器 :编译并执行查询
数据管理器:
- 事务处理器 :处理事务
- 缓存管理器 :在使用数据之前先将其放入内存中,然后在将其写入磁盘之前先将其放入内存中
- 数据访问管理器 :访问磁盘上的数据
在这篇文章的剩余部分,我将着重讲述一个数据库系统如何用下面三个过程来处理SQL查询的 - 客户端管理器 - 查询管理器 - 数据管理器(这里也会讲恢复管理器)
客户端管理器
客户端管理器是处理与客户通信的部分。客户端可以是(Web)服务器或最终用户/最终应用程序。客户端管理器提供了通过一组不同的API访问数据库,常见的有:JDBC,ODBC,OLE-DB…
它还可以提供私有的数据库访问API。
当您连接到数据库时:
- 客户端管理器首先检查您的身份验证(您的登录名和密码),然后检查您是否具有该数据库的授权。这些访问权限由您的DBA设置。
- 然后,它检查是否存在可用于管理查询的进程(或线程)。
- 它还会检查数据库是否负载过重。
- 它可以等待片刻以获取所需的资源。如果此等待达到超时,它将关闭连接并给出可读的错误消息。
- 然后它将您的SQL发送到查询管理器并处理您的查询
- 由于查询处理不是“所有结果或全无”的进程,因此,一旦它从查询管理器获取数据,它将部分结果存储在缓冲区中并开始发送给您。
- 出现问题时,它将停止连接,为您提供易于理解的报错解释并释放资源。
本篇文章分以下章节,当前第5节, 下一节是重点: