执行流程
- 加载id=1的记录所在的整页数据到缓存池;
- 旧值写入undolog便于回滚;
- 更新内存数据;
- 写redo log到RedoBuff;
- redo log顺序写入磁盘,准备提交事务(prepare阶段);
- 准备提交事务,binlog写入磁盘;
- 写入commit标记到redo log文件里,提交事务完成,该标记为了保证事务提交后redo log和binlog数据一致;
- 系统空闲时,随机写入磁盘,以page为单位写入。
为什么MySQL不直接更新磁盘上的数据而设置这么一套复杂的机制来执行SQL?
因为来一个请求就直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差,所以直接更新磁盘文件不能让数据库抗住高并发。
MySQL这套机制看起来复杂,但他可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性。
更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是远高于随机读写磁盘文件的。
正是通过这套机制,才能让MySQL在较高配置的机器上每秒可以抗下几千甚至上万的读写请求。
什么是redo log和binlog的2阶段提交?
prepare阶段:
- 这个阶段SQL已经执行并更新BufferPool内存数据
- 生成redo log到redolog buff并开始顺序写入磁盘
binlog写入磁盘持久化
commit:写入commit标记到redo log文件里,提交事务完成
什么是WAL机制?
先写redo log后刷新数据库文件的机制叫做WAL(Write-Ahead Logging)机制,效率更高。