diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index 18e4b8d..8cc7346 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -240,7 +240,7 @@ innodb中存在如下集中类型的fuzzy checkpoint: checkpoint_age = redo_lsn - checkpoint_lsn async_water_mark = 0.75 * total_redo_log_file_size sync_water_mark = 0.9 * total_redo_log_file_size -```` +``` 假设定义了2个redo log文件,并且每个文件大小为1G,那么`total_redo_log_file_size`的大小为2G. @@ -295,4 +295,35 @@ innodb采用了自适应的缓冲区刷新算法,根据redo log的生成速率 ### innodb_adaptive_flushing 通过`innodb_adaptive_flushing`变量,可以控制自使用刷新是否被启用,默认情况下其被启用。 +## Log Buffer +log buffer为内存中的区域,用于保存将要写入到磁盘log文件中的数据。log buffer的大小通过`innodb_log_buffer_size`来进行配置,默认其值为`64MB`。 + +log buffer中的内容将会被定期刷新到磁盘中,`当log buffer足够大时,事务在提交之前无需将redo log内容刷到磁盘中`。 + +### innodb_flush_log_at_trx_commit +`innodb_flush_log_at_trx_commit`用于控制如何将log buffer中的内容刷新到磁盘中。 + +默认情况下,该变量的值为`1`,代表在事务提交时会将log buffer中的redo log内容刷新到磁盘为文件中。 + +### innodb_flush_log_at_timeout +`innodb_flush_log_at_timeout`控制刷新频率。 + +## Master Thread +master thread中的操作主要分为两部分: +- 每秒钟执行一次的操作 +- 每10s执行一次的操作 + +### 每秒钟执行一次的操作 +master thread中每秒一次的操作包括如下内容: +- 将log buffer中的内容刷新到磁盘,即使对应事务尚未提交(总是) +- 合并插入缓冲(可能) + +> 对于redo log,即使事务当前尚未提交,innodb仍然会每秒将log buffer中的内容刷新到缓冲区中 + +> 合并插入缓冲并不是每秒都会发生,innodb会根据前1s内发生的IO次数是否小于5来判断是否合并插入缓冲。如果小于5次,那么当前IO负载较小,可以执行合并缓冲操作。 + +### 每10秒执行的操作 +- 合并至多5个插入缓冲(总是) +- 将日志缓冲刷新到磁盘(总是) +- 删除无用的undo log页(总是)