第1章 数据库管理系统概述
1.1 课程简介
DBMS的学习一般可分为两个阶段:
第一个阶段是学习DBMS的使用,包括如何运用数据库语言创建、访问和管理数据库,如何利用DBMS设计开发数据库应用程序。(SQL语句的使用)
第二个阶段是学习DBMS的内部结构和实现机制。(SQL语句是怎么样被执行的)
一个关系型DBMS需要考虑的一些关键问题,如:
- 数据库在存储介质上是如何组织和存储的?
- 一条SQL语句是如何被正确地解析执行的?
- 有哪些结构和方法可以用来快速定位数据库中的记录,提高存取效率?
- 多用户共享数据库时,如何在避免并发错误的同时提高并发度?
- 发生故障时,如何保证数据库能够恢复到正确的状态?
1.2 数据库管理系统的组成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7ualtRR-1635054903247)(https://oceanbase-partner.github.io/lectures-on-dbms-implementation/images/1-1.png)]
单线框表示系统模块,双线框表示内存中的数据结构,实线表示控制流+数据流,虚线表示数据流。
DBMS的几大主要功能的处理流程:数据定义、数据操纵和事务管理,这些功能均依赖底层的存储管理及缓冲区管理组件提供对磁盘中数据的访问支持。
1.2.1 存储及缓冲区管理
存储管理器的任务是控制数据在磁盘上的放置和数据在磁盘与内存之间的交换。存储管理器登记了数据在磁盘上所处的位置,将上层模块提出的逻辑层面的页面访问请求映射为物理层面的磁盘访问命令。
缓冲区管理器将内存空间划分为与页面同等大小的帧,来缓存从磁盘读入的页面,并保证这些页面在内存和磁盘上的副本的一致性。
DBMS中所有需要从磁盘获取信息的上层模块都需要与缓冲区管理器交互,通过缓冲区读写数据。这些信息包括以下类型:
- 数据:数据库自身的内容。
- 元数据:描述数据库的结构及其约束的数据库模式。
- 日志记录:记录事务对数据库所做修改的信息,用于保证数据库的一致性和持久性。
- 统计信息:DBMS收集和存储的关于表、索引等数据库对象的大小、 取值分布等信息,用于查询优化。
- 索引:支持对数据进行高效存取的数据结构。
1.2.2 DDL命令的处理
DDL是指数据定义语言(对库、表的语言,非数据的语言),比如创建或者删除表、索引等。数据库模式的描述信息称为元数据。DDL命令由DDL处理器解析其语义,然后调用记录管理器及索引管理器对相应的元数据进行修改。
1.2.3 DML命令的处理
DML是指数据操纵语言,DML又可分为对数据库的修改操作(增、删、改)和对数据库的查询操作。
DML命令的处理中最重要的部分是查询处理。查询处理的过程分为以下几步:
- 查询分析及检查:语法分析,转为语法树,然后进行查询检查(例如,检查查询中所提到的关系是否确实存在),并将语法树中的某些结构转换成内部形式,形成查询树。查询树表示了一个关系代数表达式,即要在关系上执行的一系列操作。
- 查询优化:查询优化器利用元数据和关于数据的统计信息来确定哪个操作序列可能是最快的,将最初的查询树等价转换为最高效的操作序列。
- 查询执行:执行引擎负责查询计划的执行,完成查询计划中的各个操作,得到最终的执行结果。在执行过程中,它需要与DBMS中很多其他组件进行交互。例如,调用记录管理器和索引管理器获取需要的数据,调用并发控制组件对缓冲区中的某条记录加锁以避免并发错误,或者调用日志组件登记对数据库所做的修改。
1.2.4 事务处理
事务是一组数据库操作,这组操作要么都做,要么都不做,不可分割。
对事务的处理由事务管理器负责,它包括并发控制组件和日志及恢复组件,目的是保证事务的ACID特性,即原子性、一致性、隔离性和持久性。
事务运行过程中执行下列任务:
- 登记日志:为了保证一致性和持久性,事务对于数据库的每一个修改都在磁盘上记录日志,以保证不管在什么时候发生故障,日志及恢复组件都能根据日志将数据库恢复到某个一致的状态。日志一开始被写到缓冲区中,然后会在适当的时机从日志缓冲区写回到磁盘中。
- 并发控制:事务的执行从表面上看必须是孤立的,但是在大多数系统中,实际上有许多事务在同时执行。因此,并发控制组件必须保证多个事务的各个动作以一种适当的顺序执行,从而使得最终的结果与这些事务串行执行的结果相同。常见的并发控制方式是封锁机制,通过加锁来防止两个事务以可能造成不良后果的方式存取同一数据。
1.3 关系模型和SQL
1.3.1关系模型
关系模型相对于层次模型和网状模型的优势在于:它提供了一种只使用自然结构来描述数据的方法,而不需要为了方便机器表示而附加任何额外的结构。
1.3.1.1关系
关系模型采用的数据结构称为关系。关系是一个无序的元组集合,每个元组由一组属性值构成,表示一个实体。
1.3.1.2 主键和外键
主键和外键反映了关系模型的实体完整性约束和参照完整性约束。
主键可唯一地标识关系中的一个元组。
外键指定一个关系中的属性在取值时必须与另一个关系中的某个元组相对应,不能随意取值。
1.3.1.3 关系代数
关系代数是关系模型定义的一组运算符,用于检索和操作关系中的元组。每个运算符接受一个或多个关系作为输入,并输出一个新的关系。为了表示查询,可以将这些运算符连接在一起以创建更复杂的运算,称为关系代数表达式。
常见的关系代数运算符包括:
- 选择(selection):选择运算是从关系R中选取满足给定条件的元组构成结果关系,记作σF®。
- 投影(Projection) :投影运算是从关系R中选取若干属性列A构成结果关系,记作 ΠA®。
- 并( Union ) :两个关系R和S的并是由属于R或属于S的元组构成的集合,记为 R∪S。
- 交( Intersection) :两个关系R和S的交是由既属于R又属于S的元组构成的集合,记为 R ∩ S。
- 差(Difference ) :两个关系R和S的差是由属于R但不属于S的元组构成的集合,记为 R-S。
- 笛卡尔积( Cartesian Product) :两个关系R和S的笛卡尔积是由这两个关系中元组拼接而成的所有可能的元组的集合,记为R×S。
- 自然连接(Natural Join) :两个关系R和S的自然连接是由这两个关系中在共同属性上取值相等的元组拼接而成的所有可能的元组的集合,记为R⋈S。
1.3.2 SQL
SQL 是关系数据库的标准语言。
关系模型中的关系在SQL中被映射为表或视图。
SQL的查询通过SELECT语句来表达,它的基本语法如下:
SELECT <列名或表达式序列>
FROM <表名或视图名序列>
[WHERE <行条件表达式>]
[GROUP BY <列名序列>
[HAVING <组条件表达式>] ]
[ORDER BY <排序列名>[ASC|DESC] [,...]]
该语句执行顺序:
- 读取FROM子句中基本表及视图的数据,并执行笛卡尔积操作;
- 选取其中满足WHERE子句中条件表达式的元组;
- 按GROUP BY子句中指定列的值分组;
- 提取满足HAVING子句中组条件表达式的那些分组;
- 按SELECT子句投影出结果关系;
图的数据,并执行笛卡尔积操作; - 选取其中满足WHERE子句中条件表达式的元组;
- 按GROUP BY子句中指定列的值分组;
- 提取满足HAVING子句中组条件表达式的那些分组;
- 按SELECT子句投影出结果关系;
- 按ORDER BY子句对结果关系进行排序。