mysql buffer和log

12月 1, 2021 |

Change Buffer
为了性能将secondary index的改动缓存起来,等到服务器空闲或者对应的索引所在页被读入内存的时候再写入磁盘。减少磁盘随机IO的次数
show engine innodb status 的如下节暴露change buffer的信息
INSERT BUFFER AND ADAPTIVE HASH INDEX
内存中存放在buffer pool中, 也同步到磁盘上

buffer pool
存放数据字典,数据,索引,change buffer等数据。
分成两个部分,new sublist(hot part) and old sublist,新读入数据插入中间,也就是old sublist的头部,当触发第一次读操作将其晋升到new sublist。

调节参数:
innodb_old_blocks_pct : old 部分的占比,默认3/8
innodb_old_blocks_time :新读入内存的数据必须在old 链表中待的时间,默认1s

防止read ahead,table scan导致读入太多只使用一次的数据驱逐热点数据,可以将这两个参数临时调高

redo log
ib_logfile0,ib_logfile1

undo tablespace
system tablespace {undo tablespaces or temporary tablespace}
MVCC关键技术
purge线程:物理删除delete marked数据,清理无用的undo log。
系统表空间不会收缩,最好创建独立的undo tablespace
默认 innodb_purge_rseg_truncate_frequency=128次清理一次undo log。
清理redo log 需要执行两次checkpoint 操作。

TRANSACTIONS
------------
Trx id counter trx1
Purge done for trx's n:o < trx2

如果trx2远远落后trx1,那么表示undo log没及时清理,有可能是插入过快,也有可能是某个未提交事务阻止了undolog清理
配置innodb_undo_tablespaces=2让undo log使用专有的表空间,不然undo log存放在系统表空间中,某次undo log膨胀到很大后系统表空间不能收缩。

mysql update 过程

  1. 写undo log
  2. 写redo log(nnodb_flush_log_at_trx_commit 1:w&f every commit, 0: /sec, 2:w every commit, flush /s )
  3. commit
  4. release redo log
  5. release undo log(no other transaction using undo log copy)

redo log innodb_flush_method=O_DIRECT

adaptive flush
innodb_adaptive_flushing=ON,
innodb_max_dirty_pages_pct=75
mysql 使用一个适配redo log产生速率的算法来刷新dirty page到磁盘

Posted in: database | Tags:

Comments are closed.