mysql的buffer和log

前言

现在写的还很乱,等以后再整理下,学习自用

log部分

log分为redo log, bin log, undo log三部分

redo log

数据库持久性需要把修改的内容写进磁盘中,如果这些内容在磁盘中是散布在各个位置,寻道时间则会很长,于是采用一个redo log,把这些内容先写入redo log的范围中,这样可以说就把随机写变为一个顺序写,(TODO后面会把这些redo log删掉再写入数据库吗)

bin log

不太清楚(binlog是什么,干什么用的,好像和主从复制有关,为什么MYSQL层次图说它在server层)

undo log

是用来实现事务的原子性的,也就是用来回滚事务的,这个操作通过手动调用rollback函数来实现,(在什么情况下会使用rollback呢)

buffer

  1. redo log buffer,上面提到了, redo log写入之前是写到这里的
  2. buffer pool,,包含change buffer,缓存最热的数据页(data page)与索引页(index page),InnoDB的自适应哈希也放在buffer pool 中;select到数据先放这(所有辅助索引都会放这?)
    buffer pool会用LRU来换页
  3. change buffer,这个只是针对更新(update)以及插入(insert)
    在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。是用来优化写操作的,每次写入都修改盘中数据的话随机读时间太长,可以先把修改计入change buffer中以优化
    change buffer作用:不在缓冲池中非唯一普通索引页(non-unique secondary index page)的,或者说缓存那些在buffer pool中没有的数据页中的二级缓存,对于写操作,并不会立刻将磁盘页读到缓冲池,而只记录更改到change buffer中,等以后读数据再将数据合并(merge)到缓冲池中。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能

mysql的buffer和log

Q:InnoDB buffer pool中包含change buffer和什么?这个1的page是什么

A:应该是缓存表数据与索引数据,缓存数据会用一个LRU算法进行管理

Q:索引也是放在buffer pool中的吧

Q:undo log没有buffer吗

mysql的buffer和log

mysql的buffer和log

参考资料

 

  1. https://www.lagou.com/lgeduarticle/81808.html经典图
  2. https://www.lizenghai.com/archives/43575.html给了例子看
  3. https://www.it610.com/article/1280732149103738880.htm简略的,这里说了log buffer?
  4. https://juejin.im/post/5d11a79ee51d4555e372a624说buffer pool的,含有change buffer
  5. https://juejin.im/post/5d1357b8f265da1b961314c0和第四个是同一系列
  6. https://mp.weixin.qq.com/s/0m8E7ha8xWOqd-fQu0AqgQ这个是redolog
  7. https://juejin.im/post/5b82b62e6fb9a019d80a9709张狗蛋的讲InnoDB整体架构的

TODO

  1. https://cloud.tencent.com/developer/article/1643837贼全的整体架构
  2. 面试题:总结下log什么时候刷入磁盘,checkpoint又是什么
  3. 通俗易懂-Mysql事务持久化实现之-redolog - share陈的文章 - 知乎 https://zhuanlan.zhihu.com/p/93131864各种buffer,这个也是好文
  4. buffer啊,缓冲池(buffer pool),这次彻底懂了!!! - 一只Tomcat的文章 - 知乎 https://zhuanlan.zhihu.com/p/71698872
  5. 二次写double write是什么
  6. 来自参考资料7,如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB存储引擎可以从共享表空间中的doublewrite中找到该页的一个副本,将其复制到表空间文件中,再应用重做日志(这些都是啥玩意啊..还涉及到了表空间的概念)
  7. 这篇文章可以和SQL语句的执行过程连起来