Server层

连接器

  • 管理链接, 权限验证

查询缓存

  • 命中则直接返回结果
  • 弊大于利, 不建议使用
  • mysql8.0版本直接将查询缓存的整块功能移除

分析器

  • 词法分析, 语法分析
  • 解析查询, 生成对应解析树, 预处理器进一步检查解析树的合法, 比如: 数据表和数据列是否存在,别名是有歧义等, 然后再流转到优化器
  • 知道要做什么
  • 如果语法不对, 就会收到“You have an error in your SQL syntax”的错误提醒

优化器

  • 执行生成计划, 索引选择
  • 开始执行之前, 经过优化器的处理
  • 多个索引时, 决定使用哪个索引
  • 知道怎么做

执行器

  • 操作引擎, 返回结果
  • 开始执行语句
  • 对表是否有查询权限, 如果没有, 返回没有权限错误
  • 命中查询缓存, 会在查询缓存返回结果的时候, 做权限验证
  • 有权限, 打开表, 依据表的引擎定义, 去使用这个引擎提供的接口
  • 执行器执行流程, 假定ID没有索引
    • 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
    • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
    • 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

存储引擎

  • 存储数据, 提供读写接口

日志模块

WAL技术

  • WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本。

redo log 重做日志

  • InnoDB特有的日志
  • 保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。
  • 更新语句时,InnoDB引擎就会先把记录写到redo log 里面,并更新内存,这个时候更新就算完成了
  • InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做
  • 如果 redo log空间已满,将一部分redo log记录更新到磁盘中,然后把这些记录从redo log上擦掉,为记新日志腾出空间

binlog 归档日志

  • 只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力