这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
聊聊 MySQL 的基础架构
当我们在控制台中敲入一条SQL时,MySQL底层为我们做了哪些事呢,首先我们得先认识一下MySQL的组件有哪些。
select * from t_user
MySQL 的基本架构示意图
stateDiagram-v2
[*] --> 客户端
连接器 --> 查询缓存
分析器 --> 查询缓存
客户端 --> 连接器
连接器 --> 分析器
分析器 --> 优化器
优化器 --> 执行器
执行器 --> 存储引擎
连接器、查询缓存、分析器、优化器、执行器 都属于Server层,而存储引擎层负责数据的存储和提取,像InnoDB,MyISAM都属于存储引擎。
当我们在建表时,如果不指定选用哪个存储引擎,MySQL会默认选用InnoDB,但是不管用的是哪个存储引擎,Server层都是通用的。接下来介绍各个零件的作用。
-
连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。
-
查询缓存(MySQL8.0之后取消了查询缓存)
MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个value 就会被直接返回给客户端。如果没有在缓存中查到的话,就会继续后面的查询,查到结果之后就会把结果缓存到查询缓存中。 这的确很方便,但是有个缺点是,每次对表进行修改,都会使该表上的所有缓存都删除掉,所以对于频繁修改的表来说,缓存的命中率将极低。
-
分析器
分析器先会做“词法分析”,MySQL 需要识别出里面的字符串分别是什么,代表什么。做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。并且如果T表中不存在B字段,我们执行SELECT B FROM T,也会报错,这也是在分析器中分析出来的。
-
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。两张表连接的先后顺序会影响执行的效率,优化器就是用来决定使用哪一个方案的。 例如:
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
我们既可以先从t1中取出c1为10的数据再根据ID和t2关联,最后过滤出t2中d的值为20的数据,也可以先从t2中取出d的值为20的数据再根据ID和t1关联,最后过滤出t1中c值为10的数据,该怎么选择就是由优化器为我们决定。
-
执行器
开始执行之前,执行器会先判断该用户是否有对这张表的权限,如果没有就会返回错误提示,就算是查询缓存,也会做权限的判断。 当我们执行
select * from t_user where id = 10;
时,若id并不是索引,则执行器会进行全表扫面,从表中的第一行开始,一行一行判断id是否为10,如果是的话,就会把该行的数据存到结果集中,然后依次往下执行,最后将收集到的结果返回给客户端。