这是我参与「第四届青训营」笔记创作活动的的第1天
前言:第一次接触大数据,对大数据零基础的小白来说跟着老师学习新的知识是一件很享受的事情,因为我本身就是一个喜欢探索的人,越是不会的东西我就越要搞懂,不然总感觉有什么事情没做完。今天的课程中让我印象最深的是查询优化器,也是我认为最为重要的知识点,在此记录一下我自己对查询优化器的理解。
一、什么是查询优化器
在了解查询优器的原理之前,首先了解一下什么是查询优化器,负责生成SQL语句的有效执行计划的数据库引擎组件。查询优化器的目标是找到执行 SQL 查询的最佳执行计划,执行计划就是查询树,它由一系列物理操作符组成,这些操作符按照一定的运算关系组成查询的执行计划。其实说白了就是找到一个花费最低代价的执行计划。比如说,小明从家到学校有好几条路可以选择,但是肯定有近的啊,哪条近就选哪条就对了。
二、基于规则的优化器(RBO)
RBO的优化原则:
- 尽可能读取少量的数据使其查询速度更快
- 传输数据少,速度快
- 处理数据少,执行快
RBO是根据经验预先设定优化规则,匹配的条件和优化结果都比较固定,实现简单,优化速度快,但是得到的执行计划不一定是最优的。
RBO优化方法有列裁剪、谓词下推、传递闭包、Runtime Filter
RBO----列裁剪
例:
select a.id,a.name
from a join b
on a.id=b.id and a.name=b.name
where a.id>50;`
在这段代码中涉及到的字段只有4个,但是表中的字段远不止这些,因此我们只扫描这四个字段就可以了,这样会减少许多时间。
谓词下推 所谓谓词下推就是先执行条件内容,比如这里的ID是大于50的,先执行这个操作,再进行表连接,这样就会减少来连接表的时间,从而达到优化的结果。
传递闭包 传递闭包就是等价信息的处理,比如a表的id大于50,那么b表的id肯定也是大于50的,因为条件里有要求,因此先找出表a和表b都大于50的id,再进行表的连接,这样就会减少时间。
Runtime Filter 这个其实是给定一个范围,比如说a表的数据量很少,b表的数据量很多,这时候对于a表来说肯定好找大于50的,因为它的数量少,但是对于b表来说就不是这么简单了,因此a表需要把范围给b表,这时候b表就会好找很多。比如a表查到符合条件的最低是10000,那么b只需要从10000开始就行了,相当于a给b一个确定的范围,这样就会减少数据的传输和计算的开销。
三、基于代价的优化器(CBO)
这种优化器是使用一个模型估算执行计划的代价,选择代价最小的执行计划,这种优化器也是最为常用的,它是基于统计信息推导原则的
CBO的优化原则:
- 使用代价模型和统计信息估算执行计划的代价
- 使用贪心或者动态规划算法寻找最优执行计划
- 通过RBO得到所有可能的等价执行计划
CBO的实现流程如下:
- 统计信息+推导规则
- 计算算子代价
- 计算执行计划代价
- 执行计划枚举
因为这种优化器方法还是比较容易理解的,这里就不多说了,至于统计信息推导原则其实跟算概率差不多,大数据场景下CBO对查询性能非常重要。
以上是我听完课之后对查询优化器的理解,有不对的地方,还请大家多多指正!