MySQL優(yōu)化器基于各類元數(shù)據(jù)信息和數(shù)據(jù)庫收集的統(tǒng)計信息,選擇其認為代價最低的執(zhí)行計劃。
MySQL優(yōu)化器的主要流程如下:
1、邏輯優(yōu)化
對查詢做邏輯等價變換,例如semi-join、子查詢解關(guān)聯(lián)、謂詞下推、視圖合并、左連接轉(zhuǎn)內(nèi)連接、等值推導(dǎo)等。對查詢做等價變換后,查詢生成更優(yōu)的執(zhí)行計劃,有更多的計劃選擇。
2、初始的優(yōu)化分析
對表各個可能的訪問路徑做一個掃描行數(shù)和代價分析。掃描行數(shù)和代機的分析,可以幫助后續(xù)選擇合適的基表路徑,有初始的Join表排序幫助能夠快速剪枝,后續(xù)在Join條件關(guān)聯(lián)索引和常量索引之間做選擇。
同時會分析出Const Table。Const Table是指在表條件上有primary key或者unique key等值訪問的表,從約束條件上確認最多只會獲取一行數(shù)據(jù)。Const Table在優(yōu)化期間就會執(zhí)行,獲取要訪問的數(shù)據(jù),相關(guān)的列在后續(xù)優(yōu)化中即可作為常量,使后續(xù)優(yōu)化可以更加準確。同時如果Const Table上不存在滿足條件的數(shù)據(jù)行,在優(yōu)化期間就可以被發(fā)現(xiàn),從而跳過后續(xù)的優(yōu)化和執(zhí)行過程。
3、基于代價的物理優(yōu)化
這期間會對表的訪問路徑(哪個索引)和訪問方式(等值REF、范圍RANGE),Join Order和Join方式(Nest Loop Join、Hash Join)做選擇。
4、計劃的改進
會對執(zhí)行計劃做進一步改進優(yōu)化。
把索引謂詞下推到引擎,執(zhí)行期間可以在引擎層提前過濾更多的數(shù)據(jù),減少回表還有和SQL層的交互。
當有Order by/Order by limit的時候,對Ordering index的選擇,從而避免對數(shù)據(jù)排序。
訪問方式在這個階段也可能做調(diào)整。在基表訪問選擇時候,由于估算等原因,可能同一個索引有更多條件覆蓋的RANGE掃描代價比等值REF代價高。該階段會調(diào)整為選擇可以利用更多條件的RANGE掃描。