深入理解 RDBMS | 青训营笔记

72 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第15天。青训营的第十六次课程中对关系型数据库的相关知识进行了讲解,下面是我对本次课程内容的一些总结。

SQL查询的解析、优化与执行

查询解析

关系型数据库的解析器一般由词法分析、语法分析和语义分析等步骤组装成,其将SQL查询转化为对应的语法树,以便执行器执行。

查询优化

查询优化依赖于一个基本概念,即关系代数的属性在等价表达式间被保留。其有逻辑优化和基于成本两种执行方式。

逻辑优化其中的一个例子是“逻辑下推”,即将一个谓词应用在序列的不同位置,以避免不必要的工作:

image.png

此外,还有一些逻辑优化的方法:

  • 分解复杂的谓词,合并等效的谓词,并将其压低;
  • 使得投影操作尽可能早的执行,投影去除所要求属性外的所有属性;
  • 改变连接操作的顺序,删除不必要的连接;

对于基于成本的优化方式而言,其通常基于统计表(记录不同操作的性能消耗)和启发式搜索的方法,寻找代价最小的查询方式(连接顺序、嵌套链接or哈希连接等)。

查询执行

查询执行即对语法树进行执行,并返回具体的查询结果。其由迭代器模型和向量模型两种形式。

image.png

迭代器模型自底向上的传递数据,每个语法树单元承接子节点的数据,并在处理后发送至父节点。其中,每个节点都拥有Next方法,其获得子节点的一条数据。

对于OLTP工作负载(每次查询的数据量小),还可以使得每个操作符一次性的处理并发送输出,以节约处理开销。

向量模型每次Next操作返回一批数据,具体批次的记录数由硬件的具体参数所决定。

数据存储

磁盘存储

在DBMS中,通过“页面”即一个或多个固定大小的数据块来组织数据库。每个页面具有唯一的标识符,其通常由文件名和偏移量所组成。

有几种方法用于组织页面,其中堆文件组织是其中一种,其是页面的无序集合,其中元组以随机顺序进行存储。

在页面中,存储一系列的元数据和具体的元组,其中元组在页面中的存储方式有两种:

  • 插槽法:页面中存储Header追踪元组槽的数量,其记录了槽的数量、起始位置偏移量、以及每个元组起始位置的槽数组。当添加一个数组时,插槽数组从顶到下增长,元组数据从底到上增长。
  • 日志结构法:记录以日志的形式存放在页面,要读取记录,DBMS向后扫描日志并构建元组,可以对日志进行定期压缩。LSM-Tree形式的数据库即为这种形式,leveldb是其代表。

内存存储

为了加速页面的访问,数据库一般在内存处构建页面的缓存池,当读取页面时,优先从缓存中查找页面;当写入页面时,直接将数据写入内存。

页面缓存池一般由一定的大小构成,其以LRU形式组织和淘汰页面,并且定期将数据持久化到硬盘。