SQL 查询优化器 | 青训营笔记

145 阅读3分钟

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

SQL的处理流程

image.png

1.Parser(解析器)

在计算机技术中,解析器是一种程序,通常是编译器的一部分。它以顺序源程序指令,交互式在线命令,标记标签或其他一些定义的接口的形式接收输入。解析器将它们获得的输入分解为名词(对象)、谓词(方法)及其属性或选项等部分。然后由其他编程(如编译器中的其他组件)管理这些组件。解析器还可以检查以确保已提供所有必要的输入。

2.Analyzer(分析器)

对客户端传来的 sql 进行分析,这将包括预处理与解析过程,并进行关键词的提取、解析,并组成一个解析树。在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,mysql会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。

3.Optimizer(查询优化)

进入优化器说明sql语句是符合标准语义规则并且可以执行。优化器会根据执行计划选择最优的选择,匹配合适的索引,选择最佳的方案,并将跟踪结果记录在某表中

4.Executor(执行器)

执行器负责解析 SQL 执行查询,分为两种:

单机并行:cache,pipeline,SIMD

多机并行:一个fragment对应多个实例

常见的查询优化器

Top-down Optimizer

Bottom-up Optimizer

Rule-based Optimzer(RBO)

Cost-based Optimzer(CBO)

1.RBO(基于规则的优化器)

关系代数 运算符:select,project,join,Renam,Union

等价变换:结合律、交换律、传递性

优化规则 1.Read data less and faster(I/O)

2.Transfer data less and faster (Network)

3.Process data less and faster(cpu&Memory)

列裁剪:将不需要的列表信息直接在搜索树中裁剪出去,减少数据消耗

谓词下推:JOIN与FILTER交换,把某些影响范围小的谓词下推,减少无用信息的时间消耗

传递闭包:FILTER>123推出FILTER中pv.siteld>123

Runtime Filter:提早过滤, 用(min-max in-list bloom filter)减小搜索范围(数据范围必须要集中)

总结:

主流RBO实现一般都有几百条基于经验所得到的优化规则

优点:实现简单,优化速度快

缺点:不保证得到最优的执行计划

2.CBO

使用一个模型估算执行计划的代价,选择最小的执行计划

1.执行计划代价等于所有算子的执行代价之和

2.通过RBO得到(所有)可能的等价执行计划。

算子代价:CPU、内存、磁盘I/O、网络I/O等代价

统计信息

基表统计信息: 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等 列级别:min、max、num nulls、num、not nulls、num、distinct value(NDV)、histogram 等

推导统计信息: 选择率(selectivity) :对于某一个过滤条件,查询会从表中返回多大比例的数据 基数(cardinality) :基本含义是表的 unique 行数,在查询计划中常指算子需要处理的行数

执行计划枚举

通常使用贪心算法或动态选出最优的执行计划

总结:

1.CBO使用代价模型和统计信息估算执行计划中的代价

2.CBO使用贪心或者动态规划算法寻找最优执行计划

3.在大数据场景下CBO对查询性能非常重要