请谈谈你对MySQL架构的了解?

mysql where语句 服务层 引擎层 执行_面试


如图,MySQL架构分为两层,分别是 Server 层和存储引擎层。

Server层:
包括连接器、查询缓存、分析器、优化器、执行器等,涵盖了 MySQL 的大多数核心服务功能,以及所有的内置函数(如:日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如:存储过程、触发器、视图等等。

存储引擎层:
主要负责数据的存储和提取。是插件式的架构,支持 InnoDB、MyISAM 等多个存储引擎(MySQL5.5版本后默认为InnoDB存储引擎)。不同存储引擎的表数据存取方式不同,支持的功能也不同。

说说一条SQL查询语句在数据库框架中的执行流程?

看图说话,首先解释Server层的组成:

  • 连接器:负责跟客户端建立连接、获取权限、维持和管理连接。在完成经典的TCP握手后,连接器开始认证身份。认证通过,连接器查询用户权限并建立连接。
  • 查询缓存:MySQL收到查询请求后,先查看查询缓存,执行过的语句及其结果可能会以键值对(key为查询语句,value为结果)的形式缓存在内存中,语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存。查询缓存在有更新的情况下,所有的查询缓存会被清空。(因此极其容易失效,在MySQL8.0中查询缓存功能被删除)
  • 分析器:未命中查询缓存的情况下,分析器对SQL语句解析,先进行词法分析,分析各个关键字、表名、字段名等等。然后进行语法分析,根据语法规则判断SQL语句是否满足MySQL语法。
  • 优化器:开始执行之前,还要先经过优化器的处理。优化器是在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联(join) 的时候,决定各个表的连接顺序等类似情况,优化器决定真正使用的方案。
  • 执行器:执行器阶段,开始执行语句。先判断对该表是否有执行的权限。有权限则执行,根据表的引擎定义,使用引擎提供的接口。
  • 解析执行流程:
  1. 调用InnoDB引擎接口取这个表的第一行,判断查询条件,如果不是则跳过,如果是则将这行存在结果集中。
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。(如果有索引,则调用接口逐行取满足条件的每一行)
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,SQL查询语句执行完成。