MySQL系列(七)— MySQL组件架构精讲

前言

学习了这么久MySQL方面的知识,想必你对MySQL常用的技能也有了很深的认识,但是MySQL的整个架构你了解多少呢?今天我们就从架构层面来简单介绍一下MySQL,对MySQL有一个整体的把握,为学习有一个整体的认识。

一、MySQL架构图

先来看一张MySQL的架构图:
在这里插入图片描述

从上图可以看出:MySQL是有Server层和存储引擎层两个部分组成。
Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等,可以说此层涵盖了MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层:存储引擎层主要是负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。目前最常用的存储引擎是InnoDB,也是MySQL(5.5.5版本及以后版本)默认存储引擎。也就是说我们在创建表时如果不指定表的存储引擎类型,则默认设置为InnoDB。

二、MySQL主要组件及执行步骤详解

在一中我们大致介绍了MySQL的整体组件架构,下面我们来详细看一下Server层的连接器、查询缓存、分析器、优化器、执行器分别是什么、各自主要负责哪些功能,以及MySQL的执行步骤。

1、连接器

这是第一步,负责客户端与服务端进行连接的工作。客户端(比如:Navicat、MySQL front、JDBC、SQLyog以及各种编程语言实现的客户端连接程序等)要向MySQL发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是有连接器完成的。连接过程一般如下:
客户端会先连接到数据库上,这时候首先遇到的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令:mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P 3306;连接命令中的mysql是客户端工具,用来跟服务端建立连接。在完成经典的TCP握手后,连接器就要开始认证客户端的身份,这个时候用的就是输入的用户名和密码。如果用户名或密码不对,就会返回"Access denied for user"的错误,然后客户端程序结束执行。如果用户名密码认证通过,连接器会到权限表里面查出客户端拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

2、查询缓存

连接建立完以后,接下来就是第二步了:查询缓存。
MySQL收到一个查询请求后,会先到查询缓存里检查一下,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式被直接缓存在内存中,key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中命中,那么结果就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。
为什么大多数情况查询缓存就是个鸡肋?
因为缓存失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能存起来的结果,还没使用,就被一个更新全清空了。对于更新频繁的数据库来说,查询缓存的命中率会非常低。
一般建议大家在静态表(即极少更新的表,如:系统配置表、字典表等)里使用查询缓存。MySQL也提供了这种“按需使用”的方式。你可以将my.cnf参数query_cache_type 设置成DEMAND。
query_cache_type有3个值:0代表关闭查询缓存OFF;1代表开启ON;2(DEMAND)代表当SQL语句中有SQL_CACHE关键词时才缓存
这样对于默认的SQL语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样:select SQL_CACHE * from test where id=5;
查看当前MySQL实例是否开启缓存机制,可采用命令:show global variables like “%query_cache_type%”;
注意:MySQL8.0已经移除了查询缓存功能。

3、词法分析器

查询缓存没有命中的话,就会开始真正执行SQL语句了。也就是第三步:词法分析器。
首先,MySQL需要知道你要做什么,因此需要对SQL语句做解析。分析器先会做“词法分析”。你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么。MySQL从输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。如果你的语句不对,就会收到“You have an error in your SQL syntax……”的错误提醒。
SQL经过分析器分析以后会生成类似如下的一个语法树:
在这里插入图片描述

至此分析器的工作任务也基本完成了,接下来进入到优化器。

4、优化器

SQL语句经过分析器分析后,在开始执行之前,还要先经过优化器的处理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序;以及一些mysql自己内部的优化机制。

5、执行器

开始执行SQL语句的时候,要先判断一下客户端对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误;如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

以上便是MySQL内部主要的组件架构以及一条查询SQL的执行大致过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值