InnoDB(2,java面试技巧和注意事项

  • 索引不是唯一的(不是Unique,可以重复)

当然,这种方式提高了插入效率,但同时降低了恢复效率,因为使用Insert buffer来缓冲要插入的数据,而不是第一时间插入,假如数据还在Insert buffer中,此时发生了宕机,那么后续恢复数据时就要花费更多的时间了(因为数据没有第一时间持久化进磁盘,未进磁盘的数据都要进行恢复)

同时,索引不可以是唯一的,因为Insert buffer刷新进索引页时,并不会去判断插入的新数据是否是唯一,无法保证唯一性。

//查看INNODB引擎状态

SHOW ENGINE INNODB STATUS;

在这里插入图片描述

Ibuf指的是Insert buffer缓冲池的情况

  • size:代表已经合并记录页的数量

  • free list:代表空闲列表的长度

  • seg size:Insert Buffer当前池的大小

  • merges:代表合并的次数

merged operations指的是执行了多少次合并操作,至于下面的insert、delete mark、delete会在下面Change Buffer讨论。

Insert Buffer除了数据恢复慢的问题,还有另外一个问题就是他会占用缓冲池内存,尤其在写操作密集的情况下,会占用过多的缓冲池内存,会给其他操作带来一系列的影响。

[](

)Change Buffer

Change Buffer可以看作是Insert Buffer的升级,从这个版本开始(InnoDB 1.0.X版本引入了Change Buffer),InnoDB存储引擎可以对DML操作都进行缓冲(即可以对Insert、Delete、Update进行缓冲),分别为下面的缓冲池

  • Insert Buffer

  • Delete Buffer

  • Purge Buffer

这三个Buffer和Insert Buffer一样,适用的对象仍然是不唯一的辅助索引(即满足上面提到的两个条件)

对一条记录进行UPDATE操作可能分为两个或三个过程

  • 将记录标记为已删除

  • 真正将记录删除

  • 将新的记录进行插入

Delete Buffer对应的就是将记录标记为已删除,接下来Purge Buffer将记录真正删除(Insert Buffer将新的记录插入)。

可以通过innodb_change_buffer_max_size来查看Change Buffer最大使用内存的数量

SHOW VARIABLES LIKE “innodb_change_buffer_max_size”;

在这里插入图片描述

默认值是25,表示最多可以占用缓冲池四分之一的空间。

接下来,我们回到上面提到的insert、delete mark、delete

![在这里插入图片描述](https://img-blog.csdnimg.cn/20 需要zi料+ 绿色徽【vip1024b】

210416153653623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dEVVRfVHJpbQ==,size_16,color_FFFFFF,t_70#pic_center)

  • insert表示Insert Buffer执行合并的次数

  • delete mark表示delete buffer执行合并的次数

  • delete表示purege buffer执行合并的次数

  • 下面的discarded表示,当Change Buffer发生merge操作时,表已经被删除,无序进行合并了

[](

)Insert Buffer的内部实现

Insert Buffer本质其实也是一棵B+树,在MySQL4.1版本之前,每张表都有一棵独立的Insert Buffer B+树,之后的版本,全局中只有一棵Insert Buffer B+树,存放在共享表空间中,负责对所有表的辅助索引进行Insert Buffer。

Insert Buffer是一棵B+树,因此也是由叶结点和内部结点构成,非叶子结点存放的是查询的search key(键值,共占9个字节),其构造如下图所示

在这里插入图片描述

前面提到Insert buffer全局只有一棵,那么首先要解决的问题就是要锁定哪张表,space就是表示待插入的记录所在表的表空间id(每张表都有独一无二的id),占用了4个字节,marker是为了兼容老版本的Insert buffer的,占用了一个字节,offset表示页所在的偏移量,占用了4个字节

  • space:占用4字节,储存插入记录的表id

  • markder:占用1字节,兼容老版本需要

  • offset:占用4字节,插入数据所在页的偏移量(即在页中的位置,根据偏移量去定位到正确位置)

当一个辅助索引要插入到页(space,offset)时,如果这个页不再缓冲池中,首先InnoDB引擎会根据上述规则创建一个search key,接下来就要开始查询Insert Buffer这棵B+树,search key成为内部结点,同时这条记录将被插入到Insert Buffer B+树的叶子结点中去。

但对于插入到叶子结点的数据并不是普通的插入,而是需要根据下面的规则进行插入

首先要构造出叶子结点,叶子结点的结构如下所示

在这里插入图片描述

space,markder,offset与内部结点保持一致,意义也是一样的(这里一共占了9个字节),不一样的就是多了一个metadata字段和后面的字段

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image
理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-d36rnRYp-1710349601752)]

[外链图片转存中…(img-xu5RO4FL-1710349601753)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值