MySQL-InnoDB的事务日志
笔者在阅读《高性能MySQL》的过程中,发现本书对事务日志的介绍过于晦涩也过于简略,因此结合自己的理解,详细地写一下事务日志。
InnoDB的事务日志主要分为redo log(重做日志,提供前滚操作)和undo log(回滚日志,提供回滚操作),为了最大程度上减少数据写入时io问题,在存储引擎修改表的数据时,会将数据从磁盘拷贝到内存中,然后修改内存中的数据拷贝,再将修改行为持久化到磁盘中(先写redo log buffer(日志缓冲区)(PS:这块我会在下文详细说明),再定期批量写入),而不用每次将修改的数据本身持久化到硬盘中。
(PS:这里笔者有个疑问,redo log本身是循环写,但事务日志是追加写,对此我猜测是因为redo log相对于需要写入的数据来说足够大,所以对单个事务的写入来说是追加写操作,但是从redo log整体来说,其空间是循环利用的,当空间占用到一定程度后,就会从头开始循环写数据。因此此处循环写和追加写的概念不冲突,这是笔者的猜想,水平有限可能并不准确,如果以后有了答案会来更新,当然如果有人知道也请不吝赐教)。
当事务日志持久化以后,就会将脏数据慢慢写回磁盘中(这块下面我也会详细说),目前大多数存储引擎都是这么做的,这也被叫做预写式日志(Write-Ahead Logging),修改数据的时候需要进行两次写磁盘的操作。
其实上面的概念都是老生常谈,下面我会详细地讲讲事务日志的各个部分。
redo log_buffer
事务日志本身也有缓存,这就是redo log_buffer(日志缓冲区),每次事务日志的写入并不会直接写入到文件中,而是会写入到缓冲区中,在一定事件的触发下,才会将缓冲区内的数据写入到日志文件中。
也就是说,一个写操作在InnoDB引擎内部发生的事情其实是这样的:Write info -->redo log info-->redo log buffer -->redo log file -->file。
innoDB_log_buffer_size的大小:
mysql> show variables like 'innodb_log_buffer_size%'; +------------------------+----------+ | Variable_name | Value | +------------------------+----------+ | innodb_log_buffer_size | 16777216 | +------------------------+----------+ 1 row in set (0.05 sec)
更多相关文章
- 急,mysql大数据量性能优化
- mySQL:按给定的ID字符串排序ID? (为分层数据构建面包屑)
- php数据库数据转换为js中的json对象
- 从phpMyAdmin中找出MySQL数据库URL
- 实例讲解:.NET如何访问MySQL数据库
- 给苹果osx安装mysql数据库
- mysql必知必会(一、数据库基础知识)
- Python学习笔记之MySql数据库(一)
- mysql 数据库自增id 的总结