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