名词说明

MYSQL驱动

在底层跟数据库建立网络连接

系统连接池

建立数据库连接是一个非常耗时的操作,而实际业务中往往会有很多请求去访问数据库,所以要使用一个数据库连接池来维护多个数据库连接。线程使用完连接后不用销毁,直接放回连接池以便后续使用。

MYSQL连接池

维护了与系统之间的多个数据库连接。除此之外,系统每次与MYSQL建立连接的时候,还会进行账户信息验证,库表权限验证。

SQL接口

MYSQL内部提供的一个组件,负责执行线程传递过来的SQL语句

查询解析器

负责对SQL语句进行解析,知道做什么操作,对哪张表操作,操作哪些数据,怎么操作等

查询优化器

得到一个效率最高的执行计划

执行器

根据查询优化器选择的一套执行计划,不停的调用存储引擎的各种接口去完成SQL语句的执行计划。

比如执行器可能先会调用存储引擎的一个接口去获取user表的第一行数据,判断id是否为我们期望的一个值,如果不是就继续调用接口获取下一行数据继续判断

存储引擎接口

执行SQL语句,按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据等。

流程图

流程图

InnoDB内存结构

缓冲池

缓冲池(Buffer Pool),方便查询的时候,直接可以从内存缓冲池中获取,减少对磁盘的查询

undo日志

用于回滚数据

更新缓存数据流程

  1. 记录加载到缓冲池
  2. 加锁
  3. 旧值写入undo日志文件
  4. 更新缓冲池中的记录,此时这个数据就是脏数据了(和磁盘数据不一致)

redo日志

记录内存中的数据修改,避免内存修改后没有同步到磁盘上。InnoDB存储引擎特有的一个东西。在mysql重启时会加载redo日志中的修改到内存里去,然后等适当时机通过IO线程把修改后的数据同步到磁盘上。

RedoLog Buffer

内存中的一个缓冲区。暂时存放redo日志。

binlog

归档日志,偏向物理性质的重做日志,类似于,对XX表中某一行数据进行了修改,修改后的值是XXX;在提交事务的时候,还会把binlog的文件名,位置以及commit标记写入对应的redo日志中。

事务提交流程

事务提交流程
1.根据策略(innodb_flush_log_at_trx_commit),把redo日志从redo log buffer刷到磁盘文件。

0:不管事务,每一秒都会把日志写入,并且刷到磁盘。事务提交时不会主动触发写磁盘的操作。
1:只要事务提交成功,redo log就必然在磁盘里(建议)
2:提交事务的时候,把redo日志写入磁盘对应的os cache缓存,而不是直接进入磁盘文件,可能要过一段时间再写入磁盘
  1. 根据策略(sync_binlog),把binlog日志写入磁盘

    0:写入os cache,一段时间后写入磁盘(默认)
    1:强制在提交事务的时候,直接写入到磁盘文件
  2. 把写入磁盘的binlog日志的文件名,位置以及一个commit标记写入到redo日志
  3. 至此,事务才算提交完成。只要redo日志中不存在commit标记则认为提交失败。
最后修改:2022 年 06 月 23 日
如果觉得我的文章对你有用,请点个赞吧~