这次阅读了《数据库查询优化器的艺术:原理解析与SQL性能优化》这本书,主要介绍数据库的查询优化,但是感觉这本书重复内容较多,在通过源码介绍PostgreSQL和MySQL的章节中,相对来说会更详细一些,但该部分感觉更适合直接阅读源码,因此,我在这里没有认真阅读,也是一览而过,也没有做总结。
这个脑图主要介绍原理部分,主要是书的第一个部分,包括逻辑优化和物理优化内容。
下表是Markdown格式的列表,后面接着是脑图。
# 查询优化
## 查询优化基础
### 查询重用
- cache
- 查询结果重用
- 查询计划重用
### 查询重写规则
- 逻辑优化
- 语法级
- 代数级
- 语义级
- 物理级
### 查询优化算法
- 关系节点
- 单表节点
- 两表节点
- 多表中间节点
- 查询策略
- 基于规则优化
- 基于代价优化
- 连接算法
- SYSTEM-R算法
- 启发式搜索算法
- 贪婪算法
- 动态规划算法
- 遗传算法
### 并发查询优化
### 分布式查询优化
## 逻辑查询优化
### 理论基础
- 关系代数
- 选择
- 投影
- 连接
- 自然连接
- 等值连接
- 半连接
- 反连接
- (左/右/全)外连接
- 除/并/交/差/积
### 查询重写规则
- 子查询优化
- 子查询分类
- 与外层关系
- 相关子查询
- 非相关子查询
- 父子查询无关
- 谓词
- IN/ALL/ANY/SOME
- EXISTS
- 构成
- SPJ
- GROUPBY
- 结果集
- 标量子查询
- 列子查询
- 行子查询
- 表子查询
- 优化技术
- 子查询合并
- 子查询展开
- 将简单查询(不包含聚集/GROUPBY/DISTINCT)的子查询
- 重写为等价的多表连接操作
- 需要确保展开后的DISTINCT属性,去重
- IN
- ALL/ANY/SOME
- EXISTS
- 聚集子查询消除
- 视图重写
- SPJ简单视图
- 非SPJ复杂视图
- 等价谓词重写
- LIKE规则
- LIKE 'Abc%' -> >='Abc' AND < 'Abd'
- BETWEEN-AND规则
- 与LIKE类似
- IN转换OR规则
- IN转换ANY规则
- OR转换ANY规则
- ALL/ANY转换集函数规则
- 等价的MIN/MAX谓词
- NOT规则
- OR重写并集UNION规则
- 条件化简
- HAVING条件并入WHERE条件
- 不存在GROUPBY/聚集函数
- 去除表达式中冗余的括号
- 常量传递
- 消除死码
- 表达式计算
- 等式变换
- 不等式变换
- 布尔表达式变换
- 谓词传递闭包
- 转换成等价的合取范式(CNF)
- 索引的利用
- 外连接消除
- 意义
- 外连接操作时间多于内连接
- 更灵活的表连接顺序
- 块嵌套连接/索引循环连接将规模小作为外表,可以减少IO开销
- 外连接转换
- 内连接
- Pairs
- 左外连接
- Pairs + LHS
- 右外连接
- Pairs + RHS
- 全外连接
- Pairs + LHS + RHS
- 空值拒绝(reject-NULL)
- 从结果中排除外连接右侧生成的值为NULL的行
- 外连接的提供空值的一侧为另一侧的每行只返回一行
- 嵌套连接消除
- 如只包含内连接,则表次序可以交换
- 如包含外连接,表次序不可交换
- 连接消除
- 主外键关系表连接,可消除主键表
- 唯一键作为连接条件,三表内连接可去除中间表(只作为连接条件)
- 可消除的表作为连接对象外,不出现在任何子句中
- 语义优化/语义转换
- 连接消除
- 推知简化操作
- 连接引入
- 使原关系变小/选择率降低
- 谓词引入
- 如引入基于索引的列,使查询更快
- 检测空回答集
- 谓词与约束相悖
- 排序优化
- 如有索引,排序操作可省略
- 唯一性使用
- 非SPJ的优化
- GROUPBY优化
- 分组操作下移
- 较大幅度地减少元组个数
- 分组操作上移
- 连标能过滤大部分元组
- ORDERBY优化
- 排序消除
- 利用索引
- 排序下推
- DISTINCT优化
- Distinct消除
- Distinct推入
- Distinct迁移
## 物理查询优化
### 查询代价估算
- 代价模型
- IO代价+CPU代价
- 选择率常用方法
- 无参数方法
- 参数法
- 曲线拟合法
- 抽样法
- 综合法
### 单表扫描算法
- 算法
- 顺序扫描
- 索引扫描
- 只读索引扫描
- 行扫描
- 并行表扫描
- 并行索引扫描
- 组合多个索引扫描
- 代价估计
- 顺序扫描
- N_page*a_page_IO_time+N_tuple*a_tuple_CPU_time
- 索引扫描
- N_page_index*a_page_IO_time+N_tuple*a_tuple_CPU_time
### 索引
- 索引扫描
- Seq Scan
- Index Scan
- Index only Scan
- Bitmap Index Scan
- 索引列的位置
- 目标列
- 一般不使用索引
- MAX/MIN可使用索引
- Where/Join On
- key <op> 常量
- 可高效使用索引
- GROUPBY
- 一般不使用
- HAVING
- GROUPBY/HAVING子句包含索引列
- ORDERBY
- DISTINCT
- 联合索引
- 前缀部分索引
- 多个索引
- 选择相对简单的索引
### 两表连接算法
- 嵌套循环连接
- 基于块的嵌套循环连接
- 排序归并连接
- Hash连接
- 简单Hash连接
- 优美Hash连接
- 混合Hash连接
- 读取数据的趟数
### 多表连接算法
- 问题
- 多表连接顺序
- 多表连接的搜索空间
- 多表连接顺序
- 连接树
- 表连接搜索算法
- 动态规划
- 启发式方法
- 贪婪算法
- System R算法
- 保存子树的最优查询计划和次优查询计划
- 遗传算法
*XMind - Trial Version*
脑图
![4a568e742d954ac2fcc60920f4c51a40.png](https://i-blog.csdnimg.cn/blog_migrate/afedeb8bf1b7328cbafbd878bca40492.jpeg)
书目:《数据库查询优化器的艺术:原理解析与SQL性能优化》