mysql第七章课后答案_mysql核心内幕第七章-查询解析与优化器
查詢優化器是指生成查詢計劃的子系統,該子系統通常完全處于服務器端,根據要參與連接(join)的表、數據讀取方式(所殷讀取或表掃描)和索引選擇等因素制定查詢計劃。以基于開銷的優化器為例,數據庫查詢優化器的任務是,通過產生可供選擇的多個執行計劃,并從中選出最低估算開銷的執行計劃,來優化一條SQL語句。這在數據庫系統和SQL語句性能表現上扮演了至關重要的角色。
MySQL解析器
MySQL解析器主要有兩部分組成:
詞法分析(Lexical Analysis 或 Scanner)
語法分析(Syntax Analysis 或 Parser)
詞法分析階段是MySQL解析SQL語句過程的第一個階段。這個階段的任務是從左到右一個字符、一個字符地讀入源輸入,即對構成源程序的字符流進行掃描,然后根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用 lex 或 GNU 開源的 Flex 等工具自動生成。
語法分析是MySQL解析過程的第二個階段,該過程是一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達式”等。語法分析程序判斷源程序在結構上是否正確。源程序的結構由上下文五官文法描述。語法分析常用Bison工具自動處理。
詞法分析程序將整個查詢語句分解成各類標志,語法分析根據定義的系統語言將“各類標志”轉為對MySQL有意義的組合(Item類)。最后系統生成一個語法樹,語法樹便是優化器依賴的數據結構。
下面是一個查詢語句的例子:
SELECT name FROM faculty f, classes c where f.id = c.fac_id AND f.department_id = 'CS' AND c.semester = 'F2001';
這個查詢語句的作用是找到計算機專業在2001年秋季的所有課程名
語法分析程序檢查輸入的字節流,并將整個字節流轉為各類標志。對于上面的這個查詢,標志如下:
SELECT
name
FROM
faculty
f
classes
c
WHERE
f
.
id
=
c
.
fac_id
AND
f
.
department_id
=
CS
AND
c
.
semester
=
F2001
所有這些標志在MySQL內部都是一個對象。它們都屬于Item類的子類,例如關鍵字、字符串、數字和操作符等。語法分析器(Parser)根據設定的規則,組合這些標志。在本例中,select語句的語法規則可在sql/sql_yacc.cc中找到。最終sql/sql_yacc.cc得到的語法樹如下圖:
詞法分析程序
sql/lex.h 中定義了 MySQL 關鍵字:
static SYMBOL symbols[] = {
{“&&”, SYM(AND_AND_SYM)},
{“
{“<=”, SYM(LE)},
{“<>”, SYM(NE)},
{“!=”, SYM(NE)},
{“=”, SYM(EQ)},
{“>”, SYM(GT_SYM)},
{“>=”, SYM(GE)},
{“<
{“>>”, SYM(SHIFT_RIGHT)},
{“ACTION”, SYM(ACTION)},
{“ADD”, SYM(ADD)},
…
}
sql/lex.h 中定義的MySQL函數關鍵字:
static SYMBOL sql_function[] = {
“ADDDATE”, SYM(ADDDATE_SYM)},
“COUNT”, SYM(COUNT_SYM),
“EXTRACT”, SYM(EXTRACT_SYM),
“MAX”, SYM(MAX_SYM),
“MIN”, SYM(MIN_SYM),
“NOW”, SYM(NOW_SYM),
}
語法分析器
MySQL的語法規則使用了GNU Bison 工具。在sql/sql_yaacc.yy中我們可以找到 MySQL 的語法定義,MySQLL利用 sql_yacc.yy 生成 sql_yacc.cc文件。語法分析器從 yyparse 開始執行。
例子:幾個常見的類
如下,是SELECT 和 UNION 操作的解析:
UNION 表達式 := (SELECT 表達式|UNION 表達式) UNION (SELECT 表達式|UNIOIN表達式)
SELECT 表達式 := SELECT (SELECT 表達式*)
MySQL 用 SELECT 結點來代表一個 SELECT 查詢,而用一個 UNIT 結點來代表一個 UNION 操作符或者 SELECT 下的子查詢;
LEX::unit 為根節點,LEX::select_lex 指向 SQL 中的第一個 SELECT 語句。
下面舉例說明 MySQL 解析 select 和 union 后生成的解析樹:
以下說明 JOIN 類和 TABLE_LIST 類
在 MySQL 的解析樹中,MySQL 將所有查詢語句都理解成 JOIN操作。這里的 JOIN 比 SQL 語句中的 JOIN 概念要廣泛得多。在 SQL 語句中,我們對一個表的讀取并不采用 JOIN 操作,而在解析樹中,一個表也是 JOIN 操作。
TABLE_LIST 類是 TABLE 容器類,JOIN 操作使用的 TABLE 對象群被放置于 TABLE_LIST 中。TABLE_LIST 類的成員和方法如下:
JOIN 操作符具有下面的形式:
JOIN 表達式 := (JOIN 表達式|JOIN嵌套) JOIN (JOIN 表達式|JOIN嵌套)
JOIN 嵌套 := ‘(‘(表引用|JOIN表達式)(.表引用|JOIN表達式)*’)’ | 表引用
因此所有的JOIN 表達式都可以用JOIN 表達式和 JOIN 嵌套這兩個基本結點來代表,如下圖所示:
X,Y結點可以是 JOIN 表達式、JOIN 嵌套或表引用之一,而 ON (…)表達式一定在 Y 結點上。同時當 Y 為表引用時,也稱之為內表(inner table)。nest_last_join 和 nested_join 都稱之為“嵌套結點”。
查詢優化器
采用優化器的主要原因:
優化器可以從數據字典中獲取許多統計信息,例如表中的行數、表中的每個列的分布情況等。優化器可以根據這些信息選擇有效的執行計劃,而用戶程序則難以獲得這些信息;
優化器可以考慮百種不同的執行計劃,而程序員一般只能考慮有限的幾種可能;
優化器中包含了許多復雜的優化技術,這些優化技術往往比最好的程序員掌握的還要多。系統的自動優化相當于使得所有人都擁有這些優化技術。
總結
以上是生活随笔為你收集整理的mysql第七章课后答案_mysql核心内幕第七章-查询解析与优化器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python入门二(1)
- 下一篇: mysql 1045错误ODBC_MyS