查询语句执行

mysql基本架构图

mysql 执行捕捉错误 mysql执行器_sql语句

  • 连接器:负责客户端建立连接,获取权限,管理连接,可以通过 show processlist 查看此时系统的连接状态 。
  • 查询缓存:mysql 执行查询请求时,会去查询缓存中,查询是否有缓存,如果有缓存,直接将缓存值返回。值得注意一点的是,表的更新,会将该表上的所有查询缓存清空。mysql8.0中,将查询缓存功能删除了
  • 分析器:分析器主要处理对sql语句的解析,它首先会进行语法分析,将sql语句的关键字识别出来,然后再做语法分析,会根据语法规则,判断 输入的sql语句是否合法
    例如查询语句
  • 优化器:优化器决定使用哪个索引,或再一个语句中多表关联时,决定表的连接顺序
  • 执行器: 通过分析器后,接入执行器开始执行语句,开始执行时,判断权限,进行执行sql语句,如果where 条件没有走索引,当使用InnoDB引擎时,流程为:调用InnoDB引擎,查询表第一行,判断是否满足where 条件,如果不是跳过,取下一行,直到便利结束,返回结果集
select * from T where id=xx

这就是查询的执行流程

更新流程

update a set name=123  where id=2
  • 更新流程: 分析器通过词法和语法解析出 更新语句,优化器决定使用id作为索引,执行器负责执行更新
  • 日志记录InnoDB redo log 模块:
  • 当InnoDB的修改数据时,InnoDB是把数据从磁盘读取到内存的缓冲池上进行修改。这个时候数据在内存中被修改,与磁盘中相比就存在了差异,我们称这种有差异的数据为脏页。InnoDB对脏页的处理不是每次生成脏页就将脏页刷新回磁盘,这样会产生比较大的IO操作,严重影响InnoDB的处理性能。对于此,InnoDB有一套完善的处理策略,既然脏页与磁盘中的数据存在差异,那么如果在这期间DB出现故障就会造成数据的丢失。为了解决这个问题,redo log就应运而生了。
  • 更新:当一条记录需要更新时,InnoDB引擎会把记录写到redo log ,并更新到内存,InnoDB将会在空闲时段,将操作记录更新到磁盘中
  • InnoDB redo log 写入,redo log一般为固定大小,比如为1G ,同时有一个write pos A 写入位置,check point B 当前要擦除的位置,A 点与B点之间的空间即为写入可用空间,当需要将操作记录更新到磁盘或着没有可用空间时,将会将B点往前移动擦除记录
  • binlog 日志:binlog 是mysql 二进制日志,用于记录数据库操作sql语句
  • binlog日志和redo log 日志:
  • binlog 日志为server层日志,redo log 为引擎层日志
  • redo log 是物理日志,比如:记录某个数据页更新了什么数据
  • redo log 有固定大小,循环写入,binlog 日志为追加写入
  • 数据更新流程
  • 执行器调用引擎接口,获取id=2这一行,如果在内存中存在,则直接返回执行器,否则先从磁盘读取,然后再返回
  • 执行器获取到出去,将name 设置为 123,调用引擎写入数据。
  • 引擎将数据更新到内存,同时写入redo log日志,redo log 进入prepare状态
  • 执行器写入binlog日志
  • 执行器调用引擎事务接口,将prepare状态改为commit状态,更新完成