天天看點

mysql優化器分析器,講述MySQL解析器與MySQL優化器的工作原理

MySQL解析器

MySQL解析器由兩部分組成:句法掃描器和文法規則子產品。文法掃描器講整個查詢分解為多個令牌(一些不可分割的元素,列如列名稱),同時文法規則子產品找到一個SQL文法規則組合,該組合産生這一序列,并執行與這些規則相關的代碼。最後産生一棵解析樹,現在優化器可以使用。

設想伺服器收到下列查詢:

select count(*),state from table_name group by state

這條SQL語句就會通過句法掃描器檢查查詢字元流,将其分解為令牌,然後識别每個令牌。如下:

select count (

*

)

,

state from table_name

group by state

每個令牌都有一個類型,列如一個關鍵字,一個字元串,一個數字,一個操作符或一個函數名稱。文法規則子產品安裝一系列規則與名片六相應比對,然後找出正确的規則,而上面的SQL是select 規則(sql/sql_yacc.yy) 他相應地初始化解析樹結構。

MySQL會通過sql/gen_lex_hash.cc 生成有效的關鍵字查詢散列,然後通過掃描器sql/sql_lex.cc講每個名片标記為一個關鍵字,一個函數名稱,大量特定類型或一些在文法規則中具有某種意義的特殊符号,然後這些内容通過解析器根據文法規則建立對應的解析樹。

(解析樹主要是是lex類型對象代表,在sql/sql_lex.h中有定義 成員很多 比如:enum_sql_command sql_command 它顯示我們正在執行的SQL查詢類型,是

select,update,delete,insert還是其他類型)

MySQL優化器

MySQL優化器是一個資料庫軟體非常核心的功能,雖然說起來隻是簡單的幾句話,單在MySQL内部,優化器實際上經過了很多複雜的運算分析,才得出的執行計劃。對于優化器結合于後面的知識點涉及講解。

優化器接收到解析器傳回的解析樹的内容然後會做如下幾件事情(因為優化器的内容過多暫時可以先了解做的操作即可)

MySQL優化器具有幾個重要功能

确定使用哪個鍵從表中擷取記錄,并選擇最合适該表的建。

( join)針對每個表确定掃描辨別符比讀取建更好,如果有很多記錄與建值比對,則建的優點下降,而表掃描速度更快。( join)當查詢中出現一個以上的表示,确定表的連接配接順序

重寫where從句,以删除死代碼,減少不必要的計算,盡可能更改限制條件,以便為鍵使用開辟道路

( join)從連結中删除未使用的表

确定是否能将鍵用于order by 和 group by

( join)是這是用一個内部連接配接替換一個外部連接配接

( join)試着簡化子查詢,并決定其結果的高速緩存程度( join)合并試圖(擴大視圖引用,使其成為一個宏)

總結:

總的來說當用戶端向MySQL請求一條query指令解析器子產品完成請求分類,差別出是select并轉發給優化器時,優化器會根據相應的規則對于query進行優化,處理掉一些常量表達式的預算,直接換掉常量值。并對query中的查詢條件進行簡化和轉換,如去掉一些無用或顯而意見的條件、結構調整等。然後分析query中的Hint(類似于辨別)資訊,如果有hint就會執行query的計劃,沒有就會讀取設計對象的統計資訊,根據query進行寫相應的計算分析,然後再得出最後的計劃。