MySQL语句执行过程
例如update某行某个字段的值的过程如下:
1、在Buffer Pool中加载改行数据所在页的整页数据;
2、在undo日志中写入修改前的数据以便于出现问题时会滚;
3、更新内存(Buffer Pool)中的数据
4、在名为Redo Log Buffer的内存块中写入更新后的数据(即redo日志)
5、将redo日志写入磁盘中的redo日志文件
6、同时写入binlog日志文件
7、binglog日志文件写入成功后再在redo日志文件中写入commit标记, 表示事务提交成功
8、Buffer Pool中的IO进程会随机的写入页文件到磁盘(即刷盘), 数据真正修改完成
注意点:
undo日志和redo日志是InnoDB独有的机制
undo日志是事务提交失败时用于会滚数据使用
redo日志是为了保障上面步骤8之前服务器宕机, 数据没有来得及写入磁盘, 导致数据不一致的情况, 当服务器恢复后, MySQL会将redo日志中的数据重新写入Buffer Pool中, 以解决该问题
binlog是恢复数据日志用的, 比如删库了
顺便说一句MySQL的所有crud都是在buffer pool中完成的, 而且第8步中是随机读写, redo是日志是顺序读写
MySQL通过这套复杂的机制保证了数据的完整、一致, 同时通过内存级别的操作和顺序读写保证性能
想象一下硬盘的随机读写测试测试是不是很慢?, 内存和顺序读写就保证了性能
扩展一下, kafka也是操作磁盘文件, 速度快的原因就是顺序读写, 直接通过offset偏移量就能定位