笔者在阅读《高性能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)

更多相关文章

  1. 急,mysql大数据量性能优化
  2. mySQL:按给定的ID字符串排序ID? (为分层数据构建面包屑)
  3. php数据库数据转换为js中的json对象
  4. 从phpMyAdmin中找出MySQL数据库URL
  5. 实例讲解:.NET如何访问MySQL数据库
  6. 给苹果osx安装mysql数据库
  7. mysql必知必会(一、数据库基础知识)
  8. Python学习笔记之MySql数据库(一)
  9. mysql 数据库自增id 的总结

随机推荐

  1. andriod线性布局部分用法
  2. android通过蓝牙连接打印机实现格式化打
  3. Android adb的常用命令
  4. 在 ubuntu 下编译 android 找不到头文件
  5. ANDROID Porting系列二、配置一个新产品
  6. Android主题和样式系统篇(上)
  7. ADT-bundle(Android Development Tools)
  8. Android(安卓)-- 补间动画
  9. android 引入jni 的so库的方法
  10. Android中自定义SeekBar来控制音量,并与系