MySQL面试学习总结
以一条update语句执行为例引入 一、前置阶段:建立连接与权限校验 1、连接器处理连接请求:MySQL是TCP协议传输,三次握手建立TCP协议; 2、权限预检:校验当前用户是否有目标表的权限
二、SQL解析与优化阶段
1、分析器;词法与语法分析
词法分析:语句拆解为最小语法单元,识别关键字等
语法分析:校验语句是否合法,生成抽象语法树AST
2、优化器:执行计划生成,基于AST以及表的索引信息,数据信息选择最优执行计划
三、执行阶段:核心操作与日志联动,执行器调用InnoDB接口,完成数据更新,事务隔离级别为默认的RR(可重复读)
1、加锁:保证并发安全,InnoDB对记录进行排它锁(X锁),防止其他事务修改或读取,如果未命中索引,可能会引起锁升级,间隙锁或者表锁,锁住 更大范围的数据;该步骤无日志写入
2、读取旧数据,写入undo log undo log 是逻辑日志,作用是:事务回滚、MVCC多版本并发控制。undo log 写入后,会记录到内存缓冲区,后续由后台线程异步处理
3、修改内存数据,写入redo log 先写入缓冲池,为了保证崩溃修复,会将物理日志写入重做日志缓冲区 redo log是物理日志 WAL原则:先写日志,再写磁盘
4、事务提交,刷盘redo log + 写入binlog。执行事务提交时,触发关键的日志刷盘和binlog写入流程,两阶段提交,来保证一致性 阶段1:prepare阶段:redo log刷盘:将redo log buffer中的内容刷入磁盘的redo log 文件,并标记为prepare 阶段2:commit阶段,binlog写入+redo log 状态更新,将update的语句逻辑日志写入binlog
5、异步刷盘,将缓冲池的数据写入磁盘
四、异常情况:崩溃恢复过程
根据redo log 和binlog 的状态进行恢复
redo log 为commit,事务已完成,无需处理
redo log 状态为prepare ,且存在对应的binlog:事务已完成binlog写入,更新redo log状态commit
redo log状态为prepare,但无binlog ,事务未完成binlog写入,通过undo log回滚事务
索引