Mysql InnoDB存储引擎解析


参考链接:
https://www.cnblogs.com/vinchen/archive/2012/09/10/2679478.html MySQL内核解析:Innodb页面存储结构-1
https://blog.csdn.net/yuanrxdu/article/details/42215981 MySQL系列:innodb源码分析之page结构解析
https://colinback.github.io/szyblogs/database/2018/05/23/innodb-kernel-9/
https://dev.mysql.com/doc/internals/en/innodb-user-records.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-tablespaces.html
mysql文档
https://www.jianshu.com/p/1573c4dcecd6 InnoDB逻辑存储结构
https://zhuanlan.zhihu.com/p/35811482 b和b+树
http://mysql.taobao.org/monthly/2016/02/01/ 数据库内核月报
https://juejin.im/post/5b82b62e6fb9a019d80a9709 mysql探索

存储引擎的种类

mysql底层有多种存储引擎。如果你看它的源码,打开storage目录,可以看到这么多种存储引擎:

在这里插入图片描述
下面的表说明了一些主流的存储引擎的比较:
在这里插入图片描述
详细可以参考官方文档:https://dev.mysql.com/doc/refman/5.6/en/storage-engines.html

InnoDB存储结构

其中innobase最为经典,本文讲的就是innobase存储引擎的底层结构。
InnoDB在主键上建聚簇索引:将主键组织到一棵B+树中,而行数据就储存在叶子节点上
在非主键上建辅助索引:第一步在辅助索引B+树中检索属性值,到达其叶子节点获取对应的主键;第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。MyISAM和Innodb是不一样的,在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。简单的说,InnoDB是索引组织表,使用的聚簇索引,索引就是数据,顺序存储,因此能缓存索引,也能缓存数据。MyISAM是堆组织表,使用的是非聚簇索引,索引和文件分开,随机存储,只能缓存索引。下面的图表示一张表中InnoDB和MyISAM的主键索引和辅助索引的结构:

在这里插入图片描述
在这里插入图片描述

再看看innodb的整个架构图:
在这里插入图片描述
上部分是逻辑存储结构,下部分是物理存储结构。下面的表空间和缓存交互依靠的是Inno DB Master线程。InnoDB的主要工作都是在一个或者多个单独的Master线程中完成的, Master线程的优先级最高, 分为主循环、后台循环、刷新循环、暂停循环等循环, 最主要的是主循环。主循环每秒执行一次刷新日志缓冲区, 合并插入缓冲, 最多刷新100个脏数据页, 如果当前用户没有活动信息, 切换到后台循环等操作。

内存结构

先看看图中的内存结构:
在这里插入图片描述

  • 缓冲池
    缓冲池简单来说就是一块内存区域,通过LRU算法来进行管理。对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。
  • Page
    page是Innodb存储的最基本结构,也是Innodb磁盘管理的最小单位,与数据库相关的所有内容都存储在Page结构里。Page分为几种类型,包括索引页,日志页,inode页等。
  • Insert Buffer
    InnoDB为对于非聚簇索引的插入或者更新操作设计了Insert Buffer来进行优化。在InnoDB引擎上进行插入操作时,一般需要按照主键顺序进行插入才能获得较高的插入性能。当一张表中存在非聚簇的且不唯一的索引时,在插入时,数据页的存放还是按照主键进行顺序存放,但是对于非聚簇索引叶节点就不是顺序的了,这时就需要随机读取非聚簇索引页。

在插入数据过程中,不是每一次都直接插入到索引页中,而是先判断插入的非聚集索引页面是否在缓冲池中,如果在,就把记录直接插入到页中;如果不在,则先放入到一个Insert Buffer中,看似数据库这个非聚集的索引已经插到叶节点,而实际没有,这时存放在另外一个位置。
然后再以一定的频率和情况进行Insert Buffer和非聚簇索引页子节点的

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值