MySQL的内部组件结构

截屏2022-04-25 20.17.22.png
大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

Server层

主要包括连接器、查询缓存、分析器、优化器、执行器等。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

Store层

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

连接器

就是客户端工具和服务端的链接。客户端链接成功时,会创建长链接,默认链接时间时8小时。

查询缓存

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找 到 key,那么这个 value 就会被直接返回给客户端。
但查询缓存往往弊大于利。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。 因此很可能你存起来的结果还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率 会非常低。
mysql8.0已经移除了查询缓存功能

分析器

分析器就是对SQL语句进行词法分析,主要有6个主要步骤:

  • 词法分析
  • 语法分析
  • 语义分析
  • 构造执行树
  • 生成执行计划
  • 计划的执行

优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序等。

执行器

调用引擎接口获得查询结果。

  1. select * from test where id=1;

执行器的执行流程:

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

bin-log归档

binlog是Server层实现的二进制日志,他会记录我们的crud操作。
Binlog的特点:

  • Binlog在MySQL的Server层实现(引擎共用)
  • Binlog为逻辑日志,记录的是一条语句的原始逻辑
  • Binlog不限大小,追加写入,不会覆盖以前的日志

误删了数据库,可以使用binlog进行归档。
截屏2022-04-25 22.19.17.png

从bin‐log恢复数据
/usr/local/mysql/bin/mysqlbinlog ‐‐no‐defaults /usr/local/mysql/data/binlog/mysql‐bin.000828 |mysql ‐uroot ‐p crm