深入浅出——InnoDB页面结构详解,谨慎操作!

发布于:2024-10-24 编辑:匿名 来源:网络

上一篇文章分析了InnoDB的行格式,但这里扔了记录头信息。那么让我们开始吧。

请注意,本片需要一定的数据结构和算法基础。如果基础薄弱,请先确保您了解二分查找和链表,然后再简单提及页面结构。

页是InnoDB管理存储空间的基本单位。一个页面的大小一般为16KB。

InnoDB为了不同的目的设计了很多不同类型的页,比如存储表空间头信息的页、存储Insert Buffer信息的页、存储INODE信息的页、存储undo log信息的页等等。但在这里,我们主要讨论的是索引页的简要描述。

虽然只有16kb,但是可以分割成更多的图像。 Image-0image-7记录存储在页面中。

我们的存储记录将以行格式存储在用户记录中。其实UserRecords是来自于Free Space中划分的emm...这其实是一个数据结构的线性表,嗯,就是一个数组。

看来,又废话了,继续一张图直接理解image-3。但这里使用Inoodb是为了更好的管理。

UserRecords还是浪费了很多精力。这得从行格式的记录头信息中揭示出来:我们再处理一下行头信息{#line_header}。

代码语言:sql copy mysql> CREATE TABLE page_demo( -> c1 INT, -> c2 INT, -> c3 VARCHAR(0), -> PRIMARY KEY (c1) -> ) CHARSET=ascii ROW_FORMAT=Compact;Query OK, 0受影响的行数 (0.03 秒) 请注意,在本例中,我们使用 c1 作为主键,因此在行格式内存结构中,c1 取代了 row_id。内存结构图如下image-9然后把旧图拉出来。

Image-9 下面的结构我不会简化,只是在这里使用有用的点。了解了 image-4 的基本结构后,我们来尝试插入几种数据代码语言: sql copy mysql> INSERT INTO page_demo VALUES(1, , 'aaaa'), (2, , 'bbbb' ), (3, , 'cccc'),(4, , 'dddd');Query OK, 4 rows受影响 (0.00 sec)Records: 4 Duplicates: 0 warnings: 0以下是 UserRecords 中的标题信息和实际列数据 表示(是十进制)在这里,但它本质上是二进制的)。

image-9delete_mask 有这个标识符并不奇怪。大概就是 明秀栈道。

我在黑暗城苍查过。执行删除后,delete_mask被删除。

标记一下,但是找不到结果,但是底部会形成一条垃圾链。垃圾链是可重复利用的空间。

如果以后有新的记录,您可以为什么不直接删除它,因为它会覆盖重复使用的空间?删除后重新排列会消耗性能。另外,将delete_mask位设置为1和将删除的记录添加到垃圾列表实际上是两个阶段。

后面讲交易的时候,西索min_reck_mask会被添加到B+树的每一层非叶子节点中的最小记录中。我们插入的4条记录的min_rec_mask值都是0,这意味着它们不是B+树的非叶子节点中最小的。

记录n_owned我们稍后会讲heap_no。简单来说就是当前记录(行)在页面中的位置是2、3、4、5? ? ? 0和1呢?在Innodb的开发过程中,有两条记录(伪记录)被偷偷地插入其中。

一个代表最大记录,另一个代表最小记录。什么?比较大小是正确的,就是这样:对于一条完整的记录,比较记录的大小就是比较主键的大小。

比如我们插入的四行记录的主键值为:1、2、3、4。这意味着这四行记录的大小从小到大递增。

当然,对于只存储一条记录的部分列的情况,后面会讨论细所。那么这两个臭小子到底长啥样呢? 跟随 :mouse::mouse: 并看一下 image-0 作为一个单词,wtf?是的,是一个单词,但是它没有放在UserRecords中,而是放在一个叫Infimum + Supremum的地方 image-4 从图中我们可以看到最小记录和最大记录的heap_no值都是0和 1 分别。

,也就是说,它们位于前面。 record_type表示当前记录的类型。

有四种类型的记录。 0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录。

从图中我们还可以看到,我们自己插入的记录都是普通记录,它们的record_type值都是0,最小记录和最大记录的record_type值分别是2和3。 next_record 当前记录的实际数据到下一条记录的实际数据的地址偏移量。

注意:==下一条记录并不是指按照我们插入顺序的下一条记录==,而是指按照主键值从小到大的顺序的下一条记录==。还规定下确界记录(即最小记录)的下一条记录为本页主键值最小的用户记录,本页主键值最大的用户记录的下一条记录page就是Supremum记录(也就是最大的记录) image-5 从图中可以看出,我们的记录按照主键升序形成了一个单向链表。

最大记录的next_record值为0,表示最大记录没有下一条记录。它是这个单链表中的最后一个节点。

那么我们来试试这个语句: 代码语言:sql copy mysql> DELETE FROM page_demo WHERE c1 = 2;查询OK,1行受影响(0.02秒) 代码语言:txt copy image-2 删除第2条记录前后主要发生了什么这些变化:第二条记录没有从存储空间中删除,但该记录的delete_mask值为设置为1。第二条记录的next_record值变为0,表示该记录没有下一条记录。

记录1的next_record指向记录3。你可能忽略的另一件事是,最大记录的n_owned值从5变成了4。

所以,无论我们如何添加、删除或修改页面中的记录,InnoDB将始终维护一个单链表的记录。中的各个节点按照主键值从小到大的顺序连接。

为什么指针指向中间?这个位置刚刚好。往左读是记录头信息,往右读才是真正的数据。

而且,可变长度字段长度列表和NULL值列表本身是相反的顺序。这样它们就被放置得更靠近对应的字段,这大大提高了缓存命中率。

如果我们这个时候插入删除的会怎么样呢? (七进七出?nnd,可以玩了!)我们来试试代码语言:sql copy mysql> INSERT INTO page_demo VALUES(2, , 'bbbb');------------ ----------------------------------查询 OK,1 行受影响 (0.00 秒)image-1 可以从图中看出,InnoDB并没有因为新记录的插入而申请新的存储空间,而是直接复用原来删除的记录的存储空间。Tips:在介绍delete_mask时提到过,当数据页中有多条删除记录时,这些记录的next_record属性会形成这些删除记录的垃圾链表,以备将来使用。

重复利用这个存储空间。页面目录记录按照页面中主键值的升序连接成单链表。

那么如果我们想根据主键值来查找页面中的一条记录该怎么办呢?例如这个查询语句: 代码语言:sql copy SELECT * FROM page_demo WHERE c1 = 3;先说最暴力的方法,从最小的记录一路往回查找,找到第一个比当前记录大的就停止。时间复杂度为$O(N)$。

学过算法的人都知道,这样找小数据是没有问题的。那么有没有更优化的方法呢?两点?有所作为吗?为了方便大家理解,我们先举一个简单的例子。

例如,人们在看电影时通常要查找车牌号时,通常会先看剧集,然后选择国产、日韩、欧美(你走错片场了),然后再查找车牌号事实上,InnoDB也执行类似的目录过程如下:将所有正常记录(包括最大和最小记录,不包括标记为删除的记录)分为几组。每个组的最后一条记录(即该组中最大的记录)的头信息中的n_owned属性表示该记录有多少条记录,即该组中有多少条记录。

(所以,看到这里你就明白了)分别提取每组最后一条记录的地址偏移量,并按顺序存放在页尾附近。这个地方就是所谓的Page Directory,也就是页面目录(此时你应该回去看看页面各部分的图片)。

页目录中的这些地址偏移量称为槽(英文名称:Slot),因此这个页目录就是由槽组成的。image-7 我不知道你是否有任何问题,但我有! ! !最小记录的n_owned为1可以理解,一直到第4条记录也是可以理解的。

但最大的记录为什么还是5呢?因为最小记录只有它自己,所以可以理解,这里最大记录的自己实际上包括最大记录本身和插入的四个数据。为什么会这样设置呢?一如既往,请记住您的问题!这里我们也可以理解image-7。

突然感觉上面的问题稍微好理解了一点: smiley: 其实这就得说到Innodb官方的一条规则==最小记录所在的组中只能有1条记录。最大记录所在组的记录数只能在1到8之间,其余组的记录数只能在4到8之间。

==让我们揭开帷幕,看看完整的步骤吧!最初,一个数据页中只有两条记录,最小记录和最大记录,并且它们分属于两个组。此后每次插入一条记录,都会从页目录中找到一个主键值大于该记录主键值且相差最小的槽位,然后将该槽位对应的记录的n_owned值加1,表示该组又添加了一条新记录。

一条记录,直到组中的记录数等于 8。当组中的记录数等于 8 后插入一条记录时,组中的记录将分为两组,一组有 4 条记录,另一组有 4 条记录有 5 条记录。

这个过程会在页目录中添加一个新的槽来记录新组中最大记录的偏移量。这里我们插入多组看看代码语言: sql copy mysql> INSERT INTO page_demo VALUES(5, , 'eeee'), (6, , 'ffff'), (7, , 'gggg'), ( 8, , 'hhhh'), (9, , 'iiii'), (10, , 'jjjj'), (11, , 'kkkk'), (12, , 'llll'), (13, , 'mmmm '), (14, , 'nnnn'), (15, , 'oooo'), (16, , 'pppp');查询正常,12行受影响(0.00秒)---------- ----------------------------------------------------------- --- ----记录: 12 重复: 0 警告: 0 这里我们插入12组数据,加上我们之前插入的最大和最小记录,总共18组。

我们看一下内存结构图。 Image-6 拥有的是 0?如上所述,您添加的是一个插槽。

至于你是否分拥有,很容易计算。等分然后/2就可以了,因为把16条记录的信息都画在一张图中太占空间了。

,让人眼花缭乱,所以只保留了用户记录头信息中的n_owned和next_record属性,也省略了每条记录之间的箭头。没有图并不代表没有!现在我们来谈谈搜索。

事实上,一切都在这里。您可以使用暴力破解或二进制拆分。

呵呵,没必要用蛮力。只需一一比较主键大小即可。

我们在这里谈论二进制分裂是什么?有两点你不知道吗?百度一下,我这里假装大家都掌握了基本的二分查找(~呃呃呃,大部分人学完就知道了~)假设我们要找到id=6的数据来计算中间槽=(0 )/2=2 id=8 8>6 h=2 再次计算中间槽 = (0+h)/2=2 id=4 4<6 l=1h-l=1,确保在槽= 2、直接遍历就可以了(~小数据可以分成两块~)所以在一个数据页中查找指定主键值的记录的过程分为两步。:通过二分法确定记录所在槽位,找到该槽位中主键值最小的记录。

通过记录的next_record属性遍历slot所在组中的记录。这里对算法能力有一些要求。

如果你对二分查找不清楚,可以阅读我之前的文章。我不知道我是否写过它们。

反正百度都有。二分搜索仍然是计算机科学中非常重要的思想。

此外,还得出了一个二分答案。今年的ACM比赛中也使用了这个算法。

如果Page Header行有一个标题,那么该页面有一个标题就不足为奇了。其实这个header不仅仅是获取一些数据,一共56个字节。

image-9 大家一定清楚从PAGE_N_DIR_SLOTS到PAGE_LAST_INSERT和PAGE_N_RECS的含义。如果没有,我很抱歉,你应该回去再试一次。

PAGE_DIRECTION 和 PAGE_N_DIRECTION: PAGE_DIRECTION 如果新插入的记录的主键值大于前一条记录的主键值,我们就说这条记录的插入方向是向右的,反之亦然。用于指示最后一条记录的插入方向的状态是PAGE_DIRECTION。

PAGE_N_DIRECTION 假设连续几次插入新记录的方向一致,InnoDB会记录同一方向插入的记录数。该数字由 PAGE_N_DIRECTION 状态表示。

当然,如果最后一条记录的插入方向发生变化,则该状态的值会被清除并重新计数。至于剩下的与索引相关的内容,我们稍后再讲索引的时候再讨论。

下面黄色标注的就是你现在应该掌握的内容。

深入浅出——InnoDB页面结构详解,谨慎操作!

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 跨境物流火爆,运无界完成数千万元战略融资

    跨境物流火爆,运无界完成数千万元战略融资

    据投资界(ID:pedaily)1月13日消息,近日,深圳海运股份有限公司提供一——停止为中国品牌出海提供跨境物流综合服务。 无忧网络科技有限公司(简称“运无界”)正式宣布完成A轮数千万元战略融资。 本轮融资由和君资本、宝恒丰投资共同投资。 宝恒丰投资的股东由多名经验丰

    06-18

  • 几乎天天化妆的95后正在失去不化妆的权利

    几乎天天化妆的95后正在失去不化妆的权利

    各行各业期盼的报复性消费终于在美妆行业爆发了。 据星图数据对22个主流平台、8个品牌、1万种产品的监测数据显示,美妆行业总销售额达82.58亿元。 其中,天猫实现美妆化妆品销售额59秒破亿,个护销售额3分钟破亿并超越去年全天销售额,1小时售出00支口红。 京东战报显示,美妆

    06-18

  • 江宁高新区:设立50亿元宇宙专项资金

    江宁高新区:设立50亿元宇宙专项资金

    江宁高新区加快元宇宙产业发展三年行动计划()习近平与总书记就“把我国数字经济做强做优做大”,落实党的二十大报告《加快发展数字经济,推动世界各国深度融合》的重要结论《南京市加快元宇宙产业发展行动计划()》表示,江宁高新区结合自身资源禀赋,结合当前发展现状,围

    06-18

  • 好成家科技完成千万天使轮融资

    好成家科技完成千万天使轮融资

    据投资界(ID:pedaily)7月1日消息,据36氪报道,国内家电货到付款共享平台好成家科技宣布,已完成数千万元天使轮融资,投资方为顾家投资、易网易创、浩成集团,并同步完成第一批城市服务商的选拔和培训,开始建设全国30个城市的家超级流量网络。 资料显示,好成家成立于今

    06-18

  • 工信部:一季度规模以上工业单位增加值能耗同比下降8.1%

    工信部:一季度规模以上工业单位增加值能耗同比下降8.1%

    从工信部获悉,2019年全国规模以上工业增加值能耗同比下降8.1%。 一季度,我国低碳智能产品产量快速增长,新能源汽车、集成电路等产品产量分别增长3.1倍和3.1倍。 62.1%。 制造业绿色转型正在加速。 一季度,规模以上工业单位增加值能耗同比下降8.1%。

    06-18

  • 内容孵化公司三福互娱获国众创投3000万元A+轮投资

    内容孵化公司三福互娱获国众创投3000万元A+轮投资

    据投资界9月2日消息,以漫画为核心的原创IP内容提供商三福互娱完成投资获国众创投1万元A+轮融资。 三福互娱成立于2006年,以漫画业务起家。 目前涵盖漫画、影视、游戏三大业务板块。 已完成多轮融资。 官网信息显示,早在2018年,三福互娱就完成了由辰耀资本领投的数千万元P

    06-18

  • 【24小时创业-汽车交通】2024年6月7日

    【24小时创业-汽车交通】2024年6月7日

    特斯拉与比亚迪或将合作,共同拓展储能市场。 据LatePost消息,比亚迪子公司福迪电池已与特斯拉达成供货协议,预计从明年一季度开始向特斯拉供应储能电池。 此次合作可能预示着特斯拉将在汽车业务增长放缓的背景下将重点转向储能业务的发展,并寻求电池芯供应商多元化以确保供

    06-18

  • 共享打印机“小白无忧”获400万元天使轮融资

    共享打印机“小白无忧”获400万元天使轮融资

    据投资界8月18日消息,共享打印机“小白无忧”宣布获万元天使轮融资融资。 此次投资方包括具有上市公司背景的浙江海宁瑞业。 基金与前纪源资本(GGV)合伙人孙文海。   小白无忧成立于今年3月。 这是一家专注于提供共享打印机服务的公司。 打印机的所有权属于平台,使用权

    06-18

  • 振威逍遥明获数千万元A轮融资

    振威逍遥明获数千万元A轮融资

    3月19日消息,据36氪报道,振威逍遥明近日完成数千万元A轮融资。 投资方为国盛资本,是42章经济的子公司,42资本担任财务顾问独家。 据悉,本轮募集资金将用于团队扩张、品牌营销和研发投入。 这是真味逍遥成立以来的第三轮融资。 此前,公司已获得零一创投的百万美元天使轮融

    06-18

  • 由谷歌和比尔盖茨资助的聚变反应堆的建设已经开始, “能源自由”何时到来?

    由谷歌和比尔盖茨资助的聚变反应堆的建设已经开始, “能源自由”何时到来?

    “人造太阳”实际上是指核聚变反应装置。 核聚变是氢同位素氘和氚等质量较小的原子在极高温度下相互碰撞和聚集以产生新质量的过程。 较重的原子核,通常是氦的同位素。 反应过程中产生的巨大能量与太阳等恒星内部发生的反应相同,因此核聚变反应装置被称为“人造太阳”。 ▲图

    06-21

  • 蓝帆医疗公告旗下全资子公司蓝帆柏盛进行9亿人民币增资扩股

    蓝帆医疗公告旗下全资子公司蓝帆柏盛进行9亿人民币增资扩股

    蓝帆医疗宣布,蓝帆医疗全资子公司蓝帆柏盛将增资扩股9亿元人民币。 2020年1月25日晚间,蓝帆医疗(82.SZ)发布公告称,公司心脑血管业务实体及全资子公司北京蓝帆柏盛医疗科技有限公司(简称“蓝帆柏盛”)计划引进战略投资者首创健康产业(北京)基金(有限合伙)、河北临空

    06-17

  • 黑眼豆豆成员Will.i.am创立的智能硬件公司i.am+获得光大资本领投的新一轮融资, AI+时尚+消费拓展中国市场

    黑眼豆豆成员Will.i.am创立的智能硬件公司i.am+获得光大资本领投的新一轮融资, AI+时尚+消费拓展中国市场

    据投资界12月28日消息,光大控股与IDG资本广济资本产业基金(简称“基金”)共同设立的基金宣布,作为唯一中国投资者,该基金已完成美国顶级智能硬件公司i.am+的新一轮融资。 同时,i.am+大中华区是双方的合资公司。 区公司正式挂牌成立。    据悉,本次投资是光大资本智慧

    06-17