这是我参与「第四届青训营 」笔记创作活动的的第1天
1.课前准备
从编译C代码过程大致了解SQL & 语言编译原理
词法分析
源代码程序被输入到 扫描器,扫描器进行简单的语法分析,利用类似于 有限状态机将源代码中的字符序列分割成为一系列的
token
语法分析
对于语法分析的产生的记号进行语法分析,产生 语法分析树,凑成合法的表达式
语义分析
语义分析只是对于表达式进行 语法层面的分析, 它并不了解这个语句是否是真正的有意义,例如C语言中两个指针相乘是没有意义的, 但是语法上是合法的。编译器能够提供的是 静态语意(编译期确定) , 动态语意不能够在本阶段确定
SQL中的执行计划
这里以
MySQL为例子, 本人主要是在判断索引等情况下使用explain命令进行获得执行流程的各个字段的数据
其中重要的字段是
id,type,key,rows,Extra
- id : 查询的序列号
- select_type : 查询的类型,区分普通查询、联合查询、子查询等
- type : 访问的类型,比如说一般走了索引的
range,index.最差的是ALL, 全表扫描- Key: 实际上使用的索引,如果是NULL那么久表示没有使用索引
- rows:大致显示找出记录所需要的行数
- Extra:一些其他的重要的信息,是否使用了索引,是否进行了filesort等
SQL查询优化器初探
优化器的作用就好比找到两点之间的最短路径
RBO
“基于规则的优化器”, 比如在查询语句中索引的优先级是大于全表扫描的,因此优化器选择索引
CBO
基于代价的优化器,数据库会根据统计信息和代价模型计算可能执行的代价,选择最低的方案
2.课上
大数据体系
最终希望的结果是:用一句SQL处理所有的大数据流程
查询优化
目标: 找到一个正确执行代价最小的物理执行的计划
- Top-down Optimizer : 从目标输出开始,由上往下遍历计划树,找到最优的执行计划
- Bottom-up Optimizer:从零开始,由下往上遍历计划树,找到完整执行计划
RBO:基于启发式的规则,访问元信息
通过关系代数进行优化,比如说关系代数的顺序或者是利用等价意义的关系代数进行替换,但是最终执行的效率是更佳的
Tatget: 优化IO、网络、CPU
🌰:
列裁剪: 这个相对来说比较好理解,我们在SQL中进行select时候根据一写查询的条件进行过滤一下我们需要进行扫描的列,通过减少
SCAN来进行优化谓词下推: 如果
where语句能够提前的话, 那么查询效率就大大的优化了
CBO
- 统计信息+ 推到规则
- 计算算子代价
- 计算执行计划代价
- 执行计划枚举
统计信息: 我们可以在DDL中指定需要收集的信息、手动执行
explain analyze statement、动态的进行采样select count(*) from table_nameCBO会使用贪心或者是动态规划进行寻找最佳的优化
社区开源实践
Apache Calcite 执行流程:经过前面的语法分析、词法分析等获得语句,在查询的优化器中通过获得元数据信息等进行优化
总结
没有大数据的基础,听下来还是有点懵懵的状态,还需要努力啊
这节课主要是走了一遍SQL的执行流程和大数据体系
重点的内容肯定就是优化的部分了,同样也是难点,还需要进一步巩固
\