日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql第七章课后答案_mysql核心内幕第七章-查询解析与优化器

發(fā)布時(shí)間:2025/3/15 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql第七章课后答案_mysql核心内幕第七章-查询解析与优化器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

查詢優(yōu)化器是指生成查詢計(jì)劃的子系統(tǒng),該子系統(tǒng)通常完全處于服務(wù)器端,根據(jù)要參與連接(join)的表、數(shù)據(jù)讀取方式(所殷讀取或表掃描)和索引選擇等因素制定查詢計(jì)劃。以基于開銷的優(yōu)化器為例,數(shù)據(jù)庫(kù)查詢優(yōu)化器的任務(wù)是,通過產(chǎn)生可供選擇的多個(gè)執(zhí)行計(jì)劃,并從中選出最低估算開銷的執(zhí)行計(jì)劃,來優(yōu)化一條SQL語句。這在數(shù)據(jù)庫(kù)系統(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。