mysql 表的执行顺序

来源:互联网 发布:浙江省软件协会网站 编辑:程序博客网 时间:2024/06/06 09:06

在了解mysql的同时,必须要牢记住mysql的体系结构图:

mysql是由SQL接口,解析器,优化器,缓存以及存储引擎所组成的。

 

1 Connectors指的是不同语言中与SQL的交互

 

2 Management Serveices & Utilities: 系统管理和控制工具

 

3 Connection Pool: 连接池。

管理缓冲用户连接,线程处理等需要缓存的需求

 

4 SQL Interface: SQL接口。

接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

 

5 Parser: 解析器。

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

主要功能:

a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 

b.  如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

 

6 Optimizer: 查询优化器。

SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。

用一个例子就可以理解: select uid,name from user where gender = 1;

这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤

这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤

将这两个查询条件联接起来生成最终查询结果

 

7 Cache和Buffer: 查询缓存。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

 

8 Engine :存储引擎。

存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。

Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)

现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB

默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。

InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。 
Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的

MySQL语句的执行步骤
MySQL的语句一共分为11步,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。
下面我们来具体分析一下查询处理的每一个阶段
    FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1

    ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。

    JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。

    WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
    
GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
    CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.

    HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。

    SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。

    DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.

    ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.

    LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回

mysql物理文件组成
1.1日志文件
  1)错误日志:Error Log
记录了MyQL Server 运行过程中所有较为严重的警告和错误信息,以及
MySQLServer 每次启动和关闭的详细信息。在默认情况下,系统记录错误日志的
功能是关闭的.
  2)二进制日志:Binary Log & Binary Log Index
     name]”打开了记录的功能之后,MySQL 会将所有修改数据
库数据的query 以二进制形式记录到日志文件中。当然,日志中并不仅限于query
语句这么简单,还包括每一条query 所执行的时间,所消耗的资源,以及相关的事务信息
,所以binlog是事务安全的。
 
3)更新日志:update log
 4)查询日志:query log
 5)慢查询日志:slow query log
 
6)Innodb 的在线redo 日志:innodb redo log
     Innodb 是一个事务安全的存储引擎,其事务安全性主要就是通过在线redo
日志和记录在表空间中的undo 信息来保证的。redo 日志中记录了Innodb 所做的
所有物理变更和事务信息,通过redo 日志和undo 信息,Innodb 保证了在任何情
况下的事务安全性。
数据文件

在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以
数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。
1、“.frm”文件
与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定
义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”件。
2、“.MYD”文件
   “.MYD”文件是MyISAM 存储引擎专用,存放MyISAM 表的数据。每一个MyISAM
表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。
3、“.MYI”文件
“.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引相关信息。
4、“.ibd”文件和ibdata 文件
 这两种文件都是存放Innodb 数据的文件,之所以有两种文件来存放Innodb
的数据(包括索引),是因为Innodb 的数据存储方式能够通过配置来决定是使用
共享表空间存放存储数据,还是独享表空间存放存储数据。






原创粉丝点击