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