您好,欢迎访问一九零五行业门户网

退役笔记一#MySQL=lambdasql:sql+'SourceCode4ExplainPlan'_MySQL

mysql 查询执行过程 大致分为4个阶段吧:
语法分析(sql_parse.cc)
>>sql_resolver.cc # join.prepare
生成逻辑查询plan(sql_optimizer.cc)
>># join.optimize
生成物理查询plan(sql_planner.cc)
run the explain plan(sql_executor.cc) join.exec
join.prepare() :
子查询的冗余子句消除
in类型子查询优化 resolve_subquery()
将all/any等类型子查询转换为min/max操作 对简单子查询进行的优化
join.optimize():
子查询上拉 flatten_subqueries()
把外连接优化为内连接 simplify_joins()
消除嵌套连接
where子句, join/on子句,having子句化简,含有常量的表达式化简,等式合并 optimize_cond() opt_sum_query()
优化没有group by 子句的下的count(*) min() man()
确定多表连接路径 make_join_statistice()
优化distinct
创建临时表存储临时结果优化分组排序 choose_table_order()
其实,逻辑与物理优化,有点混乱,分得不明确,
就是在物理查询优化之后,继续进行了部分逻辑优化
仅两种单表扫描方式:
index scan(others), table scan(jt_all)
opt_range.h > class quick_select_i > 利用索引扫描滴总接口
其几个子类 见source code;
主要的类和结构体:
查询树 class st_select_lex
索引 struct st_key_create_information class key_part_spec
连接表 st_join_table
连接类 join : public sql_alloc
条件 cond_equal
位置 struct st_position
代价估算 cost_estimate
select now(),curdate(),curtime()
其它类似信息

推荐信息