函式間關係的主要邏輯如下:
handle_select()
}//}――第(6)層結束
//――第(5)層結束
}//――第(4)層結束
……make_outerjoin_info();//
填充外連線的資訊
……substitute_for_best_equal_field(); //
迴圈遍歷所有表示式,化簡表示式(重複的等式能去掉則直接去掉,如:where a=5 and ((a=b and b=c) orc>4) 的條件將變為:「=(a) and (=(5,a,b,c) or c>4)」)[1]
……make_join_select(); //
用於執行各種不同情況的join查詢。該函式通過join時,連線表的不同搜尋方式(唯一索引查詢、ref查詢、快速範圍查詢、合併索引查詢、全表掃瞄等不同方式),進行join操作的處理
//優化distinct謂詞相關的情況,如下多行**,處理不同的distinct情況
……
//建立臨時表
//處理簡單的in子查詢 }
――第(3)層結束,optimize()
}――第(2)層結束,mysql_select()
}――第(1)層結束,handle_select()
以上是查詢優化的整體流程,在進入第4層之前是的邏輯查詢計畫生成,如外連線轉換為內連線、表示式化簡、子查詢的消除等邏輯優化策略都是在這個階段之前完成的。
第4層之後是物理查詢計畫生成,利用貪婪(greddy)演算法,實現多個關係的訪問方式確定(順序訪問、索引訪問)、連線方式確定(巢狀迴圈連線演算法)、連線順序選取。
[1]如執行如下sql,並檢視其查詢計畫,可以看到查詢計畫的條件發生了變化:
create table t(a int, b int, c int, d int);
insert into t values(1,2,3,4);
insert into t values(5,5,5,5);
insert into t values(10,20,30,40);
explain extended select * from t where a=5 and ((a=b and b=c) orc>4);
show warnings;
查詢計畫的結果為:
select `test`.`t`.`a` as `a`,`test`.`t`.`b` as `b`,`test`.`t`.`c` as `c`,`test`.`t`.`d` as `d` from `test`.`t` where ((`test`.`t`.`a` = 5) and (((`test`.`t`.`b` = 5) and (`test`.`t`.`c` = 5)) or (`test`.`t`.`c` > 4)))
MySQL查詢優化器原始碼分析 目錄
mysql查詢優化器原始碼分析 基於mysql v6.0.0 alpha,版本號大,但已經滯後於v5.6.x等版本 多表連線優化演算法入口,choose plan 多表連線優化演算法之一,optimize straight join 按表的指定順序求解最優查詢計畫 多表連線優化演算法之二,find ...
PostgreSQL查詢優化器原始碼分析 整體流程
函式間關係的主要邏輯如下 planner 第 11 層結束,build join rel 第 10 層結束,make join rel make rels by clause joins 會呼叫make join re l make rels by clauseless joins 會呼叫make ...
MySql原始碼分析
2.請求資料流 原始碼才是王道。1.主函式sql mysqld.cc中,如下 標準入口函式 int main int argc,char ar 2.監聽連線 sql mysqld.cc handle connections sockets pthread handler t handle conne...