转载

mysql执行


select语句执行
在这里插入图片描述
join表的查询:https://manzb.top/2020/02/29/mysql-join/

  • 驱动表,被驱动表
  • 普通的就循环查:驱动表的过滤条件得出结果集n条,然后查询被驱动表n次
  • join buffer: 结果集n条放到join buffer中m次(升序排列),
    • 有索引 放满和被驱动表匹配m次,放到read_rnd_buffer主键升序排列,顺序回表查询
    • 无索引 批量全表扫描
      在这里插入图片描述

update语句执行
在这里插入图片描述
以下面的一条sql为例 (ID为主键)update T set b=b+1 where ID = 2
客户端通过连接器与mysql建立连接 
删除要update表的缓存
分析器解析sql并判断是否含有语句错误
优化器确定查询索引
执行器调用Innodb存储引擎接口获取ID=2的数据行。
Innodb存储引擎扫描主键索引查找到ID=2的行返回给server层。
执行器将B+1 调用存储引擎接口写入该行数据。
Innodb存储引擎将数据保存在内存中(WAL)。
Innodb存储引擎写redo日志,prepare状态,通知Server层。
server层 提交Binlog后通知Innodb存储引擎。
Innodb存储引擎将redo日志commit。
  至此一条update语句就执行完成了。

redo日志:Innodb存储引擎特有的机制,可以用来应对异常恢复,Crash-safe,redo可以保证mysql异常重启时,将未提交的事务回滚,已提交的事务安全落库。

二阶段提交:redo(perpare)—>binlog–>redo(commit) 保证了mysql在异常重启的时候,数据的一致性,在任意环节出错,都可以保证redo日志和binlog的一致性。

WAL:第8个步骤,innodb没有直接将数据落盘,而是存在内存中,并记录日志,这里用到的技术就是WAL(Write-Ahead Logging)。数据在持久化硬盘前,如果mysql异常重启,innodb可以根据redo日志将未持久化的数据恢复。redo日志是有大小限制的,循环写,当redo快要写满时,将redo日志头部的记录清理,擦除记录前要把内存记录更新到数据文件。

binLog: binlog 记录的是逻辑日志,是mysql的归档日志,支持所有引擎使用。与redo不同的是,binlog是不限制大小,文件追加写。

这里将老师的图贴上(对应的5–11的步骤)

  • 转载自:https://blog.csdn.net/aajjw/article/details/120763949
  • 留言