innodb存储引擎中一条sql写入的详细流程
第0步:会先去看缓冲区有没有这条数据,如果有就不进行缓存,直接进入第三步。
第1步:会将要修改的那一行数据所在的一整页加载到缓冲池Buffer Pool中
第2步:将旧值写入undo日志中,便于回滚以及mvcc机制的运作
第3步:将Buffer Pool中的数据更新为新的数据。
第4步:写入redo日志缓冲池,redo日志的内容实际和binlog差不多,但是作用不同
// 这一步之前都是在缓存中进行的,十分的高效。下面的需要和磁盘交互了。
至于什么时候刷新buffer log到redo log日志,有innodb_flush_log_at_trx_commit参数可以控制
同时innodb写入磁盘用了两段提交。具体可看:MySQL两阶段提交
第5步:准备提交事务前,将redo日志写入磁盘
第6步:准备提交日志前,将binlog日志写入磁盘
第7步:将commit标记写到redo日志中,事务提交完成。该操作时为了保证事务提交后redo和binlog数据一致性
第8步:将缓冲区的数据写入磁盘,注意这里的写入不是及时写入的,而是随机的。