標籤:os io for art ar div amp sql
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()