MySQL执行流程

内部组件结构

        结构图如下:

 大致的可以把MySQL分为Server层和引擎层两部分。

        引擎层

                引擎层负责数据的存储和提取,其架构模式是插件式的,支持Innodb、MyISAM等多个存储引擎。从5.5.5版本之后,Innodb成为了默认的存储引擎。

        Server层

                主要有连接器、词法分析器、优化器、执行器等,涵盖MySQL大多数核心服务以及内置函数(日期、数组等函数),并且还涵盖跨存储引擎的功能,比如存储过程、试图等。

                连接器

                 MySQL是开源的,所以它有很多种类的客户端,比如navicat、jdbc等。这些客户端必须和MySQL服务端建立连接之后才能够进行通信,而建立连接就是由连接器完成的。

                在建立通信连接时,如果输入的账号密码不匹配,你就会收到到一个"Access denied for user"的错误,然后客户端程序结束执行。如果认证通过,连接器会到权限表中去查询你拥有的权限,之后的权限判断都是通过建立连接时读取到的权限去判断的。这意味着,用户建立连接后,管理员修改了此用户的权限也不会影响现有的连接权限判断,只有在重新建立连接后才会生效。用户的权限表在系统表空间中(mysql库下的user表)。

                在建立连接后,如果长时间没有发送命令到服务端,连接器就会自动断开连接。这个时间是用wait_timeout参数控制的,默认8小时。

                查询缓存

                连接建立后,就可以执行select语句了。此时就会来到第二部:查询缓存。

                MySQL拿到一个查询请求后,会先查询缓存看之前是否执行过这条SQL,之前执行过的会通过key-value形式缓存在内存中。key是查询语句,value是查询结果。如果找到key则会把value直接返回给客户端。如果没找到,就会到后面的执行阶段,执行完成后会把结果缓存起来。但大多数情况下查询缓存比较鸡肋-命中率很低。因为只要有对一张表进行更新,这张表的所有缓存会被清空。所以当你缓存起来后可能还没有再次使用就已经失效了。

                这个功能的开关可以在my.cnf中设置。参数为query_cache_type,值为0(关闭)、1(开启)、2(DEMAND,SQL中有SQL_CACHE关键字时才缓存)。

                注:MySQL8.0已经移除了查询缓存功能。

                分析器

                SQL语句的分析分为词法分析与语法分析,其中MySQL的词法分析由MySQLLex[MySQL自己实现的]完成,语法分析由Bison生成。

                执行SQL时,分析器会先做“词法分析”,MySQL由多个字符串和空格组成的SQL语句识别出里面的字符分别代表了什么。做完了“词法分析”后,就要做“语法分析”,根据词法分析的结果,语法分析器会根据语法规则判断输入的SQL是否满足MySQL的语法。

                词法分析器分成6个步骤完成SQL分析:

                1、词法分析

                2、语法分析

                3、语义分析

                4、构造执行树

                5、生成执行计划

                6、计划的执行

                优化器

                经过了分析器,MySQL知道了应该做什么。在开始执行前,还要先经过优化器处理。优化器是在表里面有多个索引的时候,决定使用那个索引,或者一个语句中有关联查询的时候,决定各个表的连接顺序。经过优化器优化分析后会根据那种执行方案效率高就选用那种方案。执行方案确定后就进入了执行器阶段。

                执行器

                开始执行的时候,会先去判断账号是否有表的权限,如果没有则返回没有权限的错误。如果有权限就会根据表的引擎定义去使用引擎提供的接口。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值