这是我参与「第四届青训营」笔记创作活动的第一天
SQL的处理流程
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对查询性能非常重要