MySQL基础架构

MySQL大体可以分为Server层存储引擎层两部分。

  • Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。
  • 存储引擎层负责数据的存储和提取。其架构模式是插件式的,InnoDB是默认存储引擎

MySQL的基本架构示意图:


MySQL基本架构.jpg

一条SQL查询语句的执行流程

连接器

连接器负责与客户端建立连接、获取权限、维持和管理连接。MySQL连接命令如下:

# 连接命令:
mysql> mysql -h$ip -P$port -u$usre -p

客户端与服务端建立连接后,如果没有操作,这个连接就处于空闲状态,可以使用 show processlist 命令查看连接状态。客户端如果长时间没有操作,连接器就会自动断开,默认8小时,由 wait_timeout 参数控制。如果连接被断开后,客户端再次发送请求就需要重新建立连接。

数据库里连接建立后,如果客户端持续有请求,则一直使用同一个连接,称之为长连接。使用长连接后,有时候MySQL占用内存特别快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源在连接断开后才会释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL异常重启了。

查询缓存

MySQL拿到一个查询请求后,会先到查询缓存中看之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。

  • 如果查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。
  • 如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

但是大多数情况下建议不要使用查询缓存,因为查询缓存的失效非常频繁。可以将参数query_cache_type设置成DEMAND,这样对于默认的SQL语句都不使用查询缓存。
MySQL 8.0版本直接将查询缓存的整块功能删掉了。

分析器

MySQL需要通过分析器对SQL语句做解析。

  • 分析器先会做“词法分析”,识别出SQL语句里面的字符串分别是什么,代表什么。
  • 然后做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

MySQL通过分析器知道了要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。
开始执行的时候,要先判断对这个表有没有操作权限,如果没有,就会返回没有权限的错误。
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
select * from T where ID=10 执行器的执行流程:

  1. 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

更新语句执行流程

更新语句除了和查询语句同样要经过连接器、分析器、优化器、执行器等功能模块外,还涉及两个重要的日志模块,redo log(重做日志)binlog(归档日志)

物理日志 redo log(重做日志)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容