mysql架构?
- mysql服务端从架构上分为server层和存储引擎层:
- server层:包括连接器,查询缓存(MySQL 8.0 版本后移除)、分析器、优化器、执行器、binlog日志组件。
- 存储引擎:可替换的存储引擎,其中默认是InnoDB(MySQL 5.5.5 版本开始就被当做默认存储引擎)存储引擎,InnoDB自带一个redo.log日志组件,用于一致性非锁定读以及崩溃恢复。
一条sql语句的执行过程?
select:
- 连接建立(权限校验)
- 查询缓存
- 分析器(词法分析:通select等关键字进行表名、字段名等提取、语法分析:分析执行语句语法是否错误,表及字段是否存在)
- 优化器(按照sever认为最优方式优化语句,生成执行计划,例如索引选择,多表关联顺序等,但是并不一定是最优的)
- 执行器(先校验权限,例如当前用户有没有访问当前表的权限)
- 存储引擎(调用存储引擎返回结果)
update:
在select的基础上:
- 执行器
- 存储引擎
- 存储引擎记录(redo.log:prepare状态)
- 执行器记录bin.log
- redo.log(commit状态)
为什么 redo.log 要进行两阶段提交?
- 为了保证数据的一致性,redo.log是进行事务提交用的,而binlog是用于数据备份和同步 。
- 如果不进行两阶段提交,宕机时可能出现,redo.log或者binlog不存,从而导致数据不一致。
- 两阶段提交,极端情况下,redo.log是prepare状态,而binlog记录完成后宕机,此时就依赖mysql的机制进行处理,当服务重启后,首先判断redo.log不是commit状态,就看binlog,如果binlog完整,则提交事务,否则回滚事务,从而保证数据一致性。