MySQL查詢優化器原始碼分析 整體流程

2021-07-28 11:11:13 字數 1404 閱讀 1679

函式間關係的主要邏輯如下:

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...