MySQL的架构分为Server层和存储引擎层。
● Server层负责建立、分析和执行SQL:MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
● 存储引擎层负责数据的存取:支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。
1.连接器
- 当客户端向MySQL服务器发起连接请求的时候,会进行三次握手,因为MySQL是基于TCP协议进行传输的。
- 完成连接后,MySQL会进行登录校验,检测用户的用户名密码是否正确。
- 用户密码都没问题,连接器会获取用户的权限保存起来,后续在该连接中的操作都将基于这个权限。所以当一个用户建立连接后他的权限被修改,也不会影响已经存在连接的权限,修改完成后才会使用新的权限。
2. 查询缓存(MySQL8.0之前的版本)
- 在连接器完成工作之后,客户端可以向MySQL发送SQL语句了,在服务器收到SQL语句之后,会解析其第一个字段,看是否是查询(select)请求,如果是查询请求,则会去缓存中查询,缓存中的值是以key-value形式存储的,key为SQL语句,value为查询到的值。
- 当数据表被更新后,这个表的缓存就会被清空,因此对于更新比较频繁的表,这个查询缓存的命中率会很低,因此MySQL8.0版本删除了这个功能。
这里说的查询缓存是Server层的,并不是InnoDB中的缓存池。
3.解析器
在正式执行SQL语句之前,会对其进行解析。
- 首先进行词法解析,通过识别语句中的关键字构建SQL语法树,便于后续模块查找语句的SQL类型,表名、字段名等。
- 随后进行语法解析,根据语法规则判断这个SQL语句是否合法。
4.执行SQL
该过程分为三个阶段:预处理阶段,优化阶段,执行阶段。
- 预处理阶段:检查SQL语句中的表或字段是否存在。将select语句中的
*
拓展为所有字段。 - 优化阶段:确定语句的最终执行方案,比如表中存在多个索引的时候,优化器会基于成本的考虑决定采用那个索引。
- 执行阶段:根据计划执行SQL语句,从存储引擎中读取数据,逐条返回给客户端。