Query processing
MySQL 的 Query 处理可以分为 Parse、Prepare(Resolve/Transform)、Optimize 和 Execute 几个阶段
-
Parse
词法扫描器将 SQL 语句字符串分解为 tokens,语法分析器将 tokens 组装成语法树的子树结构,并 Reduce 为基本查询结构,最终生成 SQL 语法解析数MySQL 语法解析树结构如【MySQL·8.0·源码】MySQL 语法树结构
-
Prepare
- Resolve
语义检查
对象解析(schema名称、表名称、view 对象,将其解析为实际存储对象,并检查是否存在)
对子查询进行初步解析,尝试是否可以合并到外层 - Transform
逻辑改写转换(IN 转换为 semi-join,IN 转换为 EXISTS,ANY/ALL 改写)
Outer JOIN 到 Inner JOIN 的转换
条件谓词的 Transform
子查询的 Transform
- Resolve
-
Optimize
代价评估,table access method 选择,最优 join order 选择MySQL table access method 部分可以阅读 【MySQL·8.0·源码】MySQL 表的扫描方式
-
Execute
查询执行处理- MySQL 采用的执行模型为 Volcano 迭代模型
- MySQL 每个迭代器都有一个通用的迭代器接口,init()->read()
unique_ptr<RowIterator> iterator(new ...); if (iterator->