innodb存储引擎中一条sql写入的详细流程

 

mysql 写入文件参数 mysql写入流程_缓冲池

 

 

第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步:将缓冲区的数据写入磁盘,注意这里的写入不是及时写入的,而是随机的。