数据更新流程
流程:
- 客户端发起请求,更新一条数据
- MySQL Server接受到客户端请求,向存储引擎调用查询该条需要更新的数据
- InnoDB存储引擎从磁盘中读取数据页写入内存中
- InnoDB从数据页中查出符合条件的行数据
- MySQL修改该行数据
- InnoDB写入反更新语句的undo log
- 更新内存中的数据页
- redo log写入内存
- 当客户端执行commit提交事务时
- MySQL Server的写bin log内存
- InnoDB 提交事务
加锁的流程
注意:
bin log 和 redo log都是写入内存,可通过配置规定多久将内存中的日志落入磁盘中
redo log 可以通过修改innodb_flush_log_at_trx_commit参数配置讲redo log buffer写入磁盘中的时机
刷脏页
有时候Mysql会卡几秒不处理事务,而且磁盘IO很高,这个时候不是Mysql在进行垃圾回收,而是Mysql在刷脏页
什么是脏页
因为mysql的数据更新首先都是在内存中,所以就会导致内存中的数据与磁盘上的数据不一致,而内存中的数据页就是脏页。脏页的存在可以加快查询,且保证事务的数据隔离性
什么是刷脏
刷脏就是还要把内存中的数据页写到磁盘中,同时删除此页相关的redo log,推进check point
刷脏的时间点
- 内存中的脏页太多时,内存不足
- redo log写满了,需要推进check point
- 系统空闲,提前刷脏,预防上述两种情况