一条SQL在MySQL中如何执行的
MySQL的内部组件结构
MySQL可以分为Server层和存储引擎层
Server层
主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
Store层
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在create table时不指定表的存储引擎类型,默认会给你设置存储引擎为InnoDB。
连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。
- 验证用户名、密码;
- 查询权限表获取用户权限;
当用户建立连接之后,当其他用户对当前用户进行权限修改,不影响已建立的连接的权限,重新连接才会生效
查询缓存
MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。
缺点:只要对表更新,这个表上的所有查询缓存都会清空,导致命中率低
分析器
分析器执行步骤
- 词法分析
- 语法分析
- 语义分析
- 构造执行树
- 生成执行计划
- 计划的执行
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
执行器
根据表的引擎定义,去使用这个引擎提供的接口。
Explain关键字
在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
Explain中的列
1.id列
id列的编号是select的序列号,id列越大执行的优先级越高,id相同的从上向下执行,id为NULL的最后执行。
2.select_type列
select_type表示对应行是简单还是