<未完成>数据库系统的访问方法
上一篇博客: 数据库系统的数据存储方式 | Amiriox’s Storage
上次写博客是在一个多月前了, 最近比较忙, 博客只能抽空写. 精神状态也不是很好, 得想想办法 ()
数据库系统的访问方法
我们在这个系列的第一篇文章(数据库系统的基本概念 | Amiriox’s Storage)中就介绍了数据库的架构分层, 但没能真正展开.
| 典型关系型数据库的架构分层 |
|---|
| 查询优化(Query Planning) |
| 算子执行(Operator Execution) |
| 访问方法(Access Method) <- |
| 缓冲池管理器(Buffer Pool Manager) |
| 磁盘管理器(Disk Manager) |
具体来说:
- 磁盘管理器单纯用来和磁盘进行交互,
不过通常实现一些异步方案进行优化(Bustub 就利用了
std::promise) - 缓冲池在上一篇文章(数据库系统的数据存储方式 | Amiriox’s Storage)中介绍了, 为防止磁盘 I/O 成为性能瓶颈, 有计划地(一些页驱逐策略)将磁盘中的页加载到内存中作为内存中的一个页帧\(^{[*]}\)
- 访问方法通过特定的数据结构从页中找到上层算子执行所需要的信息, 本文将详细解释这些数据结构
- 算子是关系代数中的具体操作实现(当然, 事实上是基于可重集合, 甚至有序可重集合的特殊关系代数), 这在后面的文章中会详细介绍, 例如数据和逻辑是如何在这些算子间流动最终得出查询结果的, 算子的执行体现了程序究竟在做什么: “用逻辑塑造一个管道让数据在其中塑形”。
- 查询优化, 面对一个已知的 SQL 语句, 预估大概的执行成本, 选择采用什么索引, 某些算子的执行顺序交换, 以形成相对更优的执行计划