这是我参与「第四届青训营 」笔记创作活动的第 2 天
SQL 查询优化器最常见的就是 RBO 和 CBO 两种,本篇简单记录一下 RBO(基于规则的优化)
这些规则只是经验规则,是总结出来的,甚至有时候可能反向优化(
三个优化原则
- I/O:更少并更快地读取
- 网络:更少并更快地传输
- CPU和内存:更少并更快地处理
以下面这句 SQL 为例
SELECT pv.siteId, user.name
FROM pv JOIN user
ON pv.siteId = user.siteId AND pv.userId = user.Id
WHERE user.siteId > 123;
优化前的执行计划如下
优化规则1:列裁剪
列裁剪很好理解,就是只读取需要的列
优化规则2:谓词下推
尽早过滤掉不必要的行,减少资源占用
优化规则3:传递闭包
表达式的等值关系 + 过滤条件 = 新的过滤条件
比如这里要进行 JOIN ,有一个等值条件,而右侧有一个过滤,所以左侧也可以进行过滤
优化规则4:Runtime Filter
提早过滤左边的数据,那么就能减少开销(网络、运算等)
JOIN 的时候得到右侧 JOIN 集合的一些特性(例如知道右侧 JOIN KEY 的范围),然后通过这些特性先过滤左侧的数据
- min-max:知道了右侧的范围是 0
100,那么左侧就只扫描 0100 的范围(缺点:范围必须是很紧密的,不然意义不大) - in-list:如右侧的值很少,就可以使用 in-list ,使用集合包含过滤(缺点:右侧集合不能太大)
- bloom filter:通过右侧来构建,效果是给我一个数,如果说不在那就是不在,说在是有可能在
RBO 小结
这里只讲了 4 条经验规则,但一般实现都有几百条
优点是简单快速,但是缺点也很多,比如,不保证能得到最优的执行计划