查询优化器是指生成查询计划的子系统,该子系统通常完全处于服务器端,根据要参与连接(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核心内幕第七章-查询解析与优化器相关推荐

  1. matlab数学实验第七章课后答案,matlab数学实验第七章答案

    参考答案如下 [单选,共用题干题] 患者男性,数学实验35岁,数学实验4天前因不慎划破皮肤后出现高热.皮肤瘀斑来院.查体:体温39.1℃,血压110/70mmHg,呼吸30次/分,心率107次/分,双 ...

  2. matlab第六章课后答案,MATLAB教程2012a第6章习题解答-张志涌

    第6章 M文件和句柄函数 习题6及解答 1 请分别写出用for 和while 循环语句计算 1000000 K 0.2i 1 0.2 0.22 0.21000000的程序.此外,还请写出i 0 避免循 ...

  3. 自顶向下 谢希仁计算机网络第七版课后答案

    谢希仁计算机网络第七版课后答案 转载:链接: link. 第一章 概述 1-01 计算机网络向用户可以提供那些服务?答: 连通性和共享 1-02 简述分组交换的要点.答:(1)报文分组,加首部(2)经 ...

  4. mysql核心内幕_MySQL核心内幕

    第1章 MySQL的前世今生.1 1.1 MySQL的历史2 1.2 存储引擎4 1.3 MySQL市场6 1.4 后话8 第2章 数据库系统的立体视图9 2.1 数据库系统架构10 2.2 数据库系 ...

  5. 李航《统计学习方法》第二章课后答案链接

    李航<统计学习方法>第二章课后答案链接 李航 统计学习方法 第二章 课后 习题 答案 http://blog.csdn.net/cracker180/article/details/787 ...

  6. 李航《统计学习方法》第一章课后答案链接

    李航<统计学习方法>第一章课后答案链接 李航 统计学习方法 第一章 课后 习题 答案 http://blog.csdn.net/familyshizhouna/article/detail ...

  7. mysql内幕微盘_MySQL核心内幕(祝定泽、张海、黄建昌) PDF 扫描版[29M]

    本书由sun中国工程院的mysql专家讲解mysql内核设计和实现.作者对mysql分而治之,将复杂的mysql内核划分成多个功能子系统,从而化解了理解子系统的各个难点. 本书共分12章.第1章介绍m ...

  8. 研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案

    研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案 目录 研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案 一.简单介绍 二.计算机网络第七版(谢希仁) 第一章 课后答案 1. ...

  9. 数据结构(C语言)第二版 第四章课后答案

    数据结构(C语言)第二版 第四章课后答案 1~5 B B C A B 6~10 B B C B B 11~15 A B D (C,B) C 1.选择题 (1)串是一种特殊的线性表,其特殊性体现在(B) ...

最新文章

  1. Linux pipe函数
  2. 皮一皮:现在想上个节目一定要注明这些...
  3. 017 Android加固之APK混淆和保护方式
  4. mvc中ajax的跳转,springmvc ajax 跳转的学习笔记
  5. 《XNA高级编程:Xbox 360和Windows》3-6
  6. 手把手教你实现Java发送邮件(1)-发送简单的文本
  7. 分布式系统测试那些事儿——信心的毁灭与重建
  8. MVC +EF+linq 多表联查
  9. 在 Coding 上搭建 Hexo 个人博客!
  10. ZOJ3554 A Miser Boss(dp)
  11. 批量pingIP脚本
  12. linux rs232驱动程序,Ubuntu安装USB to RS232驱动
  13. 全球最值得模仿的500个网站(扫描版pdf)
  14. 路由配置:理解secondary ip address
  15. BM77SPP03蓝牙模块开发
  16. 2300. 咒语和药水的成功对数 ●●
  17. 第04课:了解数据必备的文本可视化技巧
  18. webpack打包生成的map文件_Webpack的devtool和source maps
  19. C#超市进销存系统管理源码(CS架构)
  20. 区块链——颠覆式创新技术

热门文章

  1. 爸爸拉合弦飞鸽传书源代码
  2. 免费语音软件可以导入你在飞鸽传书2008
  3. 飞鸽传书写每行都认认真真
  4. 《XIM 企业即时通讯软件》
  5. [强]用VC++6.0编译调试汇编程序
  6. 如果你还在徘徊在程序员的门口,那就赶紧来看看!
  7. 一个月学会Python,零基础入门数据分析
  8. Opencv图像处理之改变颜色空间
  9. sql查看视图字段信息_高级(视图 索引)
  10. linux查看tcp连接状态_Linux使用lsof查看打开的文件和网络连接