Innodb 架构

凭着记忆自己画了一下:

总体上看,主要由 内存 + 硬盘 中的内容构成

内存还可分为 innodb 自己的内存 和 操作系统文件系统的缓存

Adaptive hash index:自适应 散列 索引

    自适应指的是 :对于辅助索引,如果查询某二级索引的频率到达阈值,会将该二级索引上经常查询的前几列条件和记录所在磁盘块号建立对应关系

Buffer Pool 是Innodb 中内存部分,包括两个主要部分:

  Dirty Page : 脏数据页

  redo log buffer : redo log 写入 文件之前会先写入 redo log buffer

os File System cache:

  写入文件,但是未被 fsync 或者 bdflush 进程 刷入到磁盘文件的 内容会 保存在文件缓存中

Double write buffer:

  在 innodb 的页 和 操作系统的页 大小不一样的情况下(innodb 的页一般为 16kb,操作系统的页为 4kb),innodb 的页需要多次写入磁盘才能完整写完

  即 innodb 页写入磁盘不是原子性的,如果写了一半就断电,那么原本的页就被破坏了。redolog 中有的只是增量修改,不一定能找回原先页的全部内容,而且redolog是循环写的,之前关于这个页的redolog记录可能已经被新的redolog 记录覆盖。

  binlog 同理,如果这个页是binlog 诞生之初就存在的,有内容的,那么binlog无法找回这个页的完整内容。

  所以,最后要先保证在 硬盘中先写一份完整的拷贝,再去写磁盘中真正的数据页,真正地去覆盖数据页。

  如果数据页损坏,那么可以去磁盘中找完整拷贝,把拷贝写到目标数据页上。

Change Buffer:

  对于写操作,如果不涉及唯一性的内容,比如聚簇索引和唯一索引,那么可以先将写操作缓存在内存的change buffer中。

  等待要读数据页的时候,再把硬盘中的数据页读出来,和 change buffer 中的修改合并(merge)。

  对于写操作频繁,读操作少的事务来说收益显著。比如写日志的不会轻易被读到的东西。

  如果读操作频繁,那么不通过 change buffer,直接拿磁盘中数据页出来修改 会快得多,change buffer 还需要占用 buffer pool。

  对于读频繁,几乎不改的业务,可以把change buffer 调小

  change buffer 优化的目标是 辅助索引页,要知道,在 idb 存储中,数据页是独立的,不含主键,主键索引也是独立的数据页,辅助索引也有独立的数据页。

  修改数据还是要读入数据页的,但是辅助索引页可以不读进来,通过change buffer 在读的时候再 merge 回去,所以 change buffer 的收益在于 辅助索引页读入的减少

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hadoop架构: 关于Recovery (Lease Recovery , Block Recovery, PipeLine Recovery)

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览

    执生
  • LC1263-AI寻路优化: 距离优先bfs -> heuristic + A* -> tarjan + A*

    输入的地图的大小在 1 ~ 20,规模小,如果用dfs或bfs,并且每个点最多访问一次,则最多访问 400 个点

    执生
  • 实验:innodb 的存储顺序是否完全物理无关?

    先上结论:Innodb在idb文件中存储数据,无论是页还是记录,都是物理无关的,但是记录的物理无关只能在同一页中有效 (文末有解释)

    执生
  • change buffer,你了解么?

    最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。

    AsiaYe
  • C语言中的union

    1、union中可以定义多个成员,union的大小由最大的成员的大小决定。 2、union成员共享同一块大小的内存,一次只能使用其中的一个成员,与struct...

    用户7043923
  • 如何优雅地将printf的打印保存在文件中?

    我们都知道,一般使用printf的打印都会直接打印在终端,如果想要保存在文件里呢?我想你可能想到的是重定向。例如:

    编程珠玑
  • 多个域名都解析到一台云服务器,如何区分访问域名?

    此问题可以基于WebServer 的ServerName 机制解决,即“虚拟主机”技术来解决这个问题,它可以实现一台服务器运行多个网站,且多个网站共用一个公网I...

    云知识Online
  • 理才网创始人连续3年荣获中国HR科技影响力TOP人物|腾讯SaaS加速器·学员动态

    ? 来源 |  腾讯SaaS加速器首期项目-理才网 ---- 11月20日,2020HRTechXPO暨未来人力资源科技论坛在上海开幕。 有人为大咖的满满干货...

    腾讯SaaS加速器
  • 这家中国芯片公司年利润追上英伟达了?假的

    据投行伯恩斯坦(Bernstein)的分析师估算,一家名叫比特大陆(Bitmain)的中国初创公司正成为比特币“挖矿”行业的领军企业,而且去年的营业利润或与美国...

    AI科技大本营
  • Leetcode-8.字符串转换整数 (atoi)

    首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

    悠扬前奏

扫码关注云+社区

领取腾讯云代金券