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