全面了解MySQL的执行原理
我们每天都在访问各种网站、App,这些东西上面都存在这大量的数据,那么这些数据都是存储在哪里呢?数据库。
当我们对网站或者App做出操作去访问数据时,其实归根到底是一条SQL语句的执行,那么一条SQL语句到底是怎么执行的呢?
一、体系结构
其中涉及到很多方面的知识,那么,下面就让我带着大家一起去了解SQL语句执行背后的原理~
在开始将之前我们先来看几张图
上面这张图是MySQL官方提供的MySQL架构图,我们可以清楚的看到一个连接是要经过很多个步骤最后才获得结果的。
对于英文水平不是很好的人来说(比如我),看到上面这张图应该会是一脸懵逼的(其实认真看还是看得懂一些的),所以我在博客园找到了一张更加清晰的图,我们看下面:
![img](https://gitee.com/lgaaip/img/raw/master/20210223205536.png)
看到这张图,是不是更加清晰一点呢?很多人看到这张图其实还是无从下手,就跟我一开始学习一下,不知道哪里分析起,要怎么个分析法,所以下面我画了一个更加简显易懂的体系结构图。
简单来说,MySQL主要分为 Server层 和 存储引擎层:
Server层
:主要包括连接器、查询缓存(MySQL8.0移除)、分析器、优化器、执行器等,所有的跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图、函数等,还有一个通用的日志模块binglog存储引擎
:主要负责数据的存储和读取,采用可以替换的插件式架构,支持InnoDB、MyISAM、Memory等多个存储引擎,其中InnnoDB有属于自己的日志模块(下文会介绍到)。现在最常用的存储引擎是InnoDB,它从MySQL5.5.5版本开始被当做默认的存储引擎了。
二、组件的详细介绍
1.连接器(验证身份+权限)
连接器主要和身份认证和权限相关的功能相关,就好比一个级别很高的门卫一样。
主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即使管理员修改了该用户的权限,该用户也是不受影响的。
2.查询缓存(MySQL8.0后移除)
查询缓存主要用来缓存我们所执行的 SELECT 语句以及该语句的结果集。
连接建立后,执行查询语句的时候,会先查询缓存,MySQL 会先校验这个 sql 语句是否执行过,以 Key-Value 的形式缓存在内存中,Key 是查询语句,Value 是结果集。如果缓存 key 被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。当然在真正执行缓存查询的时候还是会校验用户的权限,是否有该表的查询条件。