MySql内部组件结构分为
- 连接器
- 查询缓存(5.8没了)
- 词法分析器
- 优化器
- 执行器
Server层:
主要包括连接器,查询缓存,分析器,优化器,执行器等,覆盖MYSQL的大多数核心服务功能,以及所有的内置函数(如日期,时间,数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器,视图等
Stroe层:
存储引擎层负责数据的存储和提取,其架构模式是插件式的(想用就用,不想用就随时换),支持InnoDB,它从MySql5.5.5版本开始成了默认存储引擎。
连接器:
MYSQL拥有非常多的客户端比如:navicat,jdbc,SQLyog等客户端,这些客户端都需要向MYSQL通信都必须要建立连接,这个建立连接的工作就是由连接器完成的
1.连接到这个数据库上,这个接待你的就是连接器,它会负责跟客户端的连接,获取权限和维持管理连接
在完成TCP握手后,连接器就会认证你的身份,这个时候需要输入用户名和密码
换句话说就是连接器里面有你权限的缓存,即使root对你权限进行了修改也是无效的,只有再次获取新的连接的时候才会使用新设置的权限,这个权限是存储在MYSQL的user表中。当然如果最大的连接的时间是默认8个小时 ,这个时间也可以通过配置wait_timeout
查询缓存
连接建立之后,你就可以执行select语句了 这个时候首先会去查询下缓存,缓存的存储形式类似于key-value,key保存的是sql语句value 保存的是结果集,如果查询不在缓存中就会执行sql语句执行完成后把执行结果放入缓存中,如果是能在缓存中查询到那么直接返回。
但是这个缓存很鸡肋?
原因是这个缓存的设计是如果对一个表的更新,那么就会将这个表的所有缓存都清空。对于经常更新的表来说,命中率非常低
只有一些静态表,读多几乎不写的表才适合缓存。在MYSQL 8.0移除了这个缓存功能
分析器:
分析器步骤:
- 词法分析
- 语法分析
- 语义分析
- 构建执行树
- 生成执行计划
- 计划的执行
如果缓存没有命中那么就开始执行语句了,首先是词法分析,MYSQL会将你输入的关键字比如select from where这种字符串变成关键词识别出来,ID识别成列ID而不是普通的字符串。
词法分析完之后就是语义分析,比如你的关键词拼错了 那么You have an error in your SQL syntax的错误提示
语义分析: MYSQL会将这个SQL给你优化
explain extended select min(id)from film where id=1;
show WARNINGS
执行构造树
优化器:
优化器决定了在表里面有多个索引的时候决定使用哪一个
在关联查询的时候想用想用那种算法:嵌套循环连接Nested-LoopJoin(NLJ)算法还是基于块的嵌套循环连接BlockNested-LoopJoin(BNL)算法
还有在范围查找的时候是否要使用索引还是不去回表直接全表扫描更快都是优化器所做的
还有等等等等。。。。
执行器
在执行前首先会验证你的权限,如果命中缓存那么直接返回。
我们在查询select * from film where id=5的时候 假设没有索引,
那么调用InnoDB引擎接口查询第一行,判断是否是等于5如果不是则跳过,如果是则放入结果集
继续调用引擎接口查询下一行 重复判断逻辑直到这个表的最后一行
将上述的遍历的过程中所有满足条件的结果集返回给客户端