大数据初探|青训营笔记

96 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

1.课前准备

从编译C代码过程大致了解SQL & 语言编译原理

Screen Shot 2022-07-24 at 9.02.09 AM.png

词法分析

源代码程序被输入到 扫描器,扫描器进行简单的语法分析,利用类似于 有限状态机将源代码中的字符序列分割成为一系列的 token

语法分析

对于语法分析的产生的记号进行语法分析,产生 语法分析树,凑成合法的表达式

语义分析

语义分析只是对于表达式进行 语法层面的分析, 它并不了解这个语句是否是真正的有意义,例如C语言中两个指针相乘是没有意义的, 但是语法上是合法的。编译器能够提供的是 静态语意(编译期确定) , 动态语意不能够在本阶段确定

SQL中的执行计划

这里以MySQL为例子, 本人主要是在判断索引等情况下使用explain命令进行获得执行流程的各个字段的数据

Screen Shot 2022-07-25 at 8.54.34 PM.png

其中重要的字段是id, type, key, rows, Extra

  • id : 查询的序列号
  • select_type : 查询的类型,区分普通查询、联合查询、子查询等
  • type : 访问的类型,比如说一般走了索引的range, index.最差的是ALL, 全表扫描
  • Key: 实际上使用的索引,如果是NULL那么久表示没有使用索引
  • rows:大致显示找出记录所需要的行数
  • Extra:一些其他的重要的信息,是否使用了索引,是否进行了filesort等

SQL查询优化器初探

优化器的作用就好比找到两点之间的最短路径

RBO

“基于规则的优化器”, 比如在查询语句中索引的优先级是大于全表扫描的,因此优化器选择索引

CBO

基于代价的优化器,数据库会根据统计信息和代价模型计算可能执行的代价,选择最低的方案

2.课上

大数据体系

Screen Shot 2022-07-24 at 10.40.15 AM.png

最终希望的结果是:用一句SQL处理所有的大数据流程

查询优化

目标: 找到一个正确执行代价最小的物理执行的计划

  • Top-down Optimizer : 从目标输出开始,由上往下遍历计划树,找到最优的执行计划
  • Bottom-up Optimizer:从零开始,由下往上遍历计划树,找到完整执行计划

RBO:基于启发式的规则,访问元信息

通过关系代数进行优化,比如说关系代数的顺序或者是利用等价意义的关系代数进行替换,但是最终执行的效率是更佳的

Tatget: 优化IO、网络、CPU

🌰:

Screen Shot 2022-07-25 at 9.30.15 PM.png

列裁剪: 这个相对来说比较好理解,我们在SQL中进行select时候根据一写查询的条件进行过滤一下我们需要进行扫描的列,通过减少SCAN来进行优化

谓词下推: 如果where语句能够提前的话, 那么查询效率就大大的优化了

CBO

  • 统计信息+ 推到规则
  • 计算算子代价
  • 计算执行计划代价
  • 执行计划枚举

统计信息: 我们可以在DDL中指定需要收集的信息、手动执行explain analyze statement、动态的进行采样 select count(*) from table_name

CBO会使用贪心或者是动态规划进行寻找最佳的优化

社区开源实践

Apache Calcite 执行流程:经过前面的语法分析、词法分析等获得语句,在查询的优化器中通过获得元数据信息等进行优化

Screen Shot 2022-07-25 at 9.44.18 PM.png

总结

没有大数据的基础,听下来还是有点懵懵的状态,还需要努力啊

这节课主要是走了一遍SQL的执行流程和大数据体系

重点的内容肯定就是优化的部分了,同样也是难点,还需要进一步巩固

\