【MySQL】SQL过程
引言
MySQL的服务器端处理SQL语句需要经过解析器、预处理器、优化器、执行器。
解析器
1.当向数据库发送SQL语句时,数据库运行的第一步是parse。parse是数据库将明文的SQL语句转换为可操作的内容的第一步,这一步的结果是一个内部树状结构,表示查询的各个部分。
词法分析:词法分析器是一个确定有限自动机(DFA),将一串原始的SQL语句字符流拆分成一个token序列,并检查每个单一token的合法性。
语法分析:将合法的Token序列转换为结构化的抽象语法树,在构建AST树中节点的同时进行token语法规则的合法性检查。在AST树构建完成后对GROUP BY、HAVING、子查询做进一步的合法性检查。
预处理器
2.下一阶段prepare,此时数据库会解析fields,确保查询是可执行的。解析fields涉及到从表的各个字段信息中做出类型推断。还将树结构中的字段节点绑定到具有相应类型的实际行引用,解析的另一个结果是,如果查询中引用的特定字段实际上不在对应的表中,并且无法解析,向前台报错。
预处理器会对语法分析生成的AST树进行标准化处理:补全隐含信息、简化表达式、统一语法格式,并且基于数据库元信息做对象存在性与权限校验:检查SQL中引用的表、列、函数是否真实存在、验证当前用户是否有访问目标表的权限,生成预处理后的AST树。
优化器
3.当将查询的必要的fields解析后,数据库会进行优化,使得查询执行更加高效,如常量折叠(直接进行常量运算)和无用代码消除。此时得到逻辑查询计划。下一步是optimize阶段,根据前面的prepare后的parse tree的逻辑查询计划,得到具体的物理执行计划。生成的物理查询计划将描述执行器应该如何连接哪些表以使执行尽可能快速和有效。找出哪些连接组合的过程可能是穷举的,但是当连接的数量增加时,穷举搜索很快就变得不可行了。
逻辑优化:通过调整连接顺序、下推过滤条件等手段减少无效计算和数据量,改写查询语句的逻辑结构消除冗余操作、简化查询表达式,其核心思想是在不影响最终结果的前提下找到一个最优等价形式,减少需要处理的数据量或操作复杂度。
物理优化:在逻辑优化得到的最优等价形式的基础上,结合数据库的物理存储细节进行成本计算,选择最优的数据访问路径、连接算法、聚合与排序方式等,形成最高效的执行方案。
执行器
4.最后,数据库将通过execute步骤执行物理查询计划。然后,该步骤将读取存储引擎,以获取物理查询计划可以使用的行数据。
执行器:调用存储引擎的API处理执行计划,接收并返回存储引擎返回的结果。
浙公网安备 33010602011771号