InnoDB 中的索引页与数据行的关联详解

目录

  1. InnoDB 数据库基础概念
    • 1.1 页(Page)的概念
    • 1.2 行(Row)的概念
  2. InnoDB 索引页的结构
    • 2.1 B+ 树索引结构
    • 2.2 页结构详解
  3. InnoDB 数据行的存储结构
    • 3.1 数据行存储格式
    • 3.2 数据行的物理存储位置
  4. 索引页与数据行的关联
    • 4.1 聚簇索引与数据页的关联
    • 4.2 辅助索引与数据页的关联
  5. InnoDB 中的页管理与优化
  6. 总结

InnoDB 数据库基础概念

1.1 页(Page)的概念

在 InnoDB 存储引擎中,**页(Page)**是最小的物理存储单位。InnoDB 默认的页大小为 16KB。数据的读写操作是以页为单位进行的,即使只需要读取一行数据,InnoDB 也会将包含该行数据的整个页加载到内存中。

InnoDB 页的类型非常多,包括数据页、索引页、UNDO 页、事务日志页等,其中我们重点关注数据页(Data Page)索引页(Index Page)

1.2 行(Row)的概念

**行(Row)**是数据库表中最小的数据存储单位。每一行记录表示表中的一条数据。在 InnoDB 中,每一行数据都会存储在数据页中,并且数据行与索引紧密相关。

数据行的存储是物理上连续的,但逻辑上却可以通过索引进行高效的查询和管理。通过理解行和页的存储关系,我们可以更好地优化查询和数据存储性能。

InnoDB 索引页的结构

2.1 B+ 树索引结构

在 InnoDB 中,所有的索引都基于 B+ 树(B+ Tree) 结构来实现。B+ 树是一种平衡树,具有高效的查询、插入和删除性能。B+ 树的非叶子节点只存储索引键值,而叶子节点则存储实际的数据页或主键指针。

B+ 树结构的主要特点:

  • 非叶子节点仅存储索引字段,不存储完整数据。
  • 叶子节点之间通过双向链表连接,以便进行范围查询。
  • B+ 树的深度通常较小,因此通过索引查找数据时,访问的磁盘页数也较少。

InnoDB 将索引页组织成 B+ 树,每个节点对应一个页。树的根节点位于最高层,而叶子节点包含实际的索引或数据。

2.2 页结构详解

每个 InnoDB 页包括多个部分,主要包含以下关键结构:

  • Page Header:页头部信息,记录页的类型、页号等元数据。
  • Infimum 和 Supremum Records:页中最小和最大的虚拟记录,用于页的分隔。
  • User Records:实际的数据记录,或索引键值。
  • Page Directory:记录数据行在页中的偏移量,用于快速查找数据。
  • Page Trailer:用于校验页是否完整。

在索引页中,页中的 User Records 包含的是索引值和与之对应的数据行指针,而在数据页中,User Records 则是实际的数据行。

InnoDB 数据行的存储结构

3.1 数据行存储格式

InnoDB 中,数据行存储在数据页(Data Page)中。数据行的存储格式依赖于表的定义方式,常见的格式有以下几种:

  • Compact 格式:这是默认的存储格式,存储效率较高。每一行记录除了实际数据外,还包含一些额外的信息(如记录头信息、事务 ID、回滚指针等)。
  • Redundant 格式:旧版本的存储格式,相对占用更多的存储空间。

每一行数据的存储包括:

  • 记录头信息:记录长度、记录类型等。
  • 事务信息:如事务 ID、回滚指针,用于保证事务一致性。
  • 实际列数据:行中每一列的实际存储数据。

3.2 数据行的物理存储位置

InnoDB 将每个表的数据存储在单独的表空间文件中(如果开启 innodb_file_per_table),数据行被存储在表空间中的数据页(Data Page)中。每个数据页可以容纳多行数据,页与页之间通过链表连接。

索引页与数据行的关联

4.1 聚簇索引与数据页的关联

在 InnoDB 中,聚簇索引(Clustered Index) 是表中最重要的索引。对于每张表,InnoDB 都会使用主键创建聚簇索引。如果没有定义主键,InnoDB 会自动生成一个隐藏的主键来作为聚簇索引。

聚簇索引的叶子节点不仅存储索引键值,还存储实际的行数据。这意味着通过聚簇索引查询数据时,查询到叶子节点即可获取完整的数据行,无需再进行其他数据页的访问。

示例

假设有一个包含 id 作为主键的表:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),age INT
) ENGINE=InnoDB;

在该表中,InnoDB 会为 id 创建聚簇索引。在 B+ 树的叶子节点,除了存储 id 值外,还存储 nameage 列的数据。因此,通过主键查询数据时,无需再从其他地方获取数据。

4.2 辅助索引与数据页的关联

辅助索引(Secondary Index) 是指除了聚簇索引外的其他索引。在 InnoDB 中,辅助索引的叶子节点只存储索引键值和对应的主键值,不存储实际的数据行。因此,当使用辅助索引查询时,首先通过索引键值找到对应的主键值,然后再通过主键去查找聚簇索引获取完整的数据行。

这种查找过程被称为回表(Index Backtracking)。当辅助索引命中时,InnoDB 会进行两次索引查找:一次是通过辅助索引查找主键值,另一次是通过主键值查找聚簇索引中的实际数据。

示例

假设我们为 employees 表中的 name 字段创建一个辅助索引:

CREATE INDEX idx_name ON employees(name);

当我们执行如下查询时:

SELECT * FROM employees WHERE name = 'John';

InnoDB 首先通过 idx_name 索引查找到 John 对应的 id 值,然后再通过聚簇索引查找到 id 对应的完整数据行。

InnoDB 中的页管理与优化

5.1 页分裂与合并

当插入新的数据时,如果当前页已满,InnoDB 会将该页分裂为两个页,这一过程称为页分裂(Page Split)。页分裂后,InnoDB 会调整 B+ 树结构以保持平衡。

相反,当删除数据时,InnoDB 可能会发生页合并(Page Merge),将数据量较少的页合并成一个页,从而减少存储空间的浪费。

5.2 页缓存与缓冲池

为了提高查询性能,InnoDB 使用了**缓冲池(Buffer Pool)**来缓存页。当查询数据时,InnoDB 会优先从缓冲池中查找数据,而

不是直接访问磁盘。这大大减少了磁盘 I/O 操作,提升了查询性能。

总结

InnoDB 中的索引页和数据行之间有着紧密的联系,聚簇索引和辅助索引的实现决定了数据的查找方式。理解索引页和数据行的关联,有助于我们更好地优化数据库的查询性能和存储效率。通过合理设计索引和优化 InnoDB 的页管理策略,可以有效提升数据库的整体性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439161.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Python学习日记-39] 闭包是个什么东西?

[Python学习日记-39] 闭包是个什么东西? 简介 闭包现象 闭包意义与作用 简介 在前面讲函数和作用域的时候应该提到过,当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量,但是在 Python 当中还有一种…

MySQL--数据库约束(详解)

目录 一、前言二、概念三、数据库约束3.1 约束类型3.1.1 NOT NULL 约束3.1.2 UNIQUE (唯一)3.1.3 DEFAULT(默认)3.1.4 PRIMARY KEY(主键)3.1.5 FOREIGN KEY(外键)3.1.6 CHECK 四、总结 一、前言…

Golang | Leetcode Golang题解之第454题四数相加II

题目: 题解: func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }

STM32新建工程-基于库函数

目录 一、创建一个新工程 二、为工程添加文件和路径 三、创建一个main.c文件,并调试 四、修改一些配置 五、用库函数进行写程序 1、首先加入一些库函数和头文件 2、编写库函数程序 一、创建一个新工程 我这里选择STM32F103C8的型号,然后点击OK。 …

如何提取b站的视频字幕,下载视频

打开视频地址 按F12打开—开发者工具 在开发者工具打开Network 过滤器关键字: 自动生成字幕:ai_subtitle 自制:json 打开/关闭字幕 刷新页面 找到字幕 点选字幕的respond 将方框中的内容复制; 复制到:https://www.drea…

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC 第一节 硬件解读第二节 CubeMX配置第三节 代码编写 第一节 硬件解读 STM32的ADC是12位,通过硬件过采样扩展到16位,模数转换器嵌入到STM32L071xx器件中。有16个外部通道和2个内部通道&#xf…

github双重验证(2FA)启用方法

一、双重验证-2FA 在去年看到过说github启用双重验证的通知,觉得做为一个普通开发者,可能没有这么快会要求启用。结果,今天早晨一来就收到了邮件,要求说在11月底完成2FA的认证,否则权限受限。真是无了语。所谓2FA好理…

CSS 实现楼梯与小球动画

CSS 实现楼梯与小球动画 效果展示 CSS 知识点 CSS动画使用transform属性使用 页面整体布局 <div class"window"><div class"stair"><span style"--i: 1"></span><span style"--i: 2"></span>…

jmeter学习(2)变量

1&#xff09;用户定义的变量 路径&#xff1a;添加-》配置元件-》用户定义的变量 用户定义的变量是全局变量&#xff0c;可以跨线程组被调用&#xff0c;但在启动运行时获取一次值&#xff0c;在运行过程中不再动态获取值。 注意的是&#xff0c;如果在某个线程组定义了全…

使用GitLab CI构建持续集成案例

1. 部署GitLab &#xff08;1&#xff09;基础准备 解压软件包并导入镜像&#xff1a; [rootmaster ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz [rootmaster ~]# tar -zxvf Gitlab-CI.tar.gz [rootmaster ~]# ctr -n k8s.io image import gitla…

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…

基于拥堵模型的轻量级平台公交室内情况监控系统

论文标题&#xff1a;Bus Indoor Situation Monitoring System Based on Congestion Model Using Lightweight Platform 作者信息&#xff1a;Dong Hyun Kim, Yun Seob Kim, 和 Jong Deok Kim* 所属机构&#xff1a;Pusan National University, Department of Computer Scienc…

网页打不开、找不到服务器IP地址

现象&#xff1a;网络连接ok&#xff0c;软件能正常使用&#xff0c;当网页打不开。 原因&#xff1a;DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的&#xff1a;VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…

Python | 使用Seaborn绘制KDE核密度估计曲线

核密度估计&#xff08;KDE&#xff09;图&#xff0c;一种可视化技术&#xff0c;提供连续变量概率密度的详细视图。在本文中&#xff0c;我们将使用Iris Dataset和KDE Plot来可视化数据集。 什么是KDE图&#xff1f; KDE图&#xff0c;全称核密度估计图(Kernel Density Est…

【JAVA开源】基于Vue和SpringBoot的旅游管理系统

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

k8s的学习和使用

为什么用k8s&#xff0c;不用docker&#xff1f; k8s更适合复杂的微服务架构和大规模的容器应用。 Pods(Pod) Pod是k8s最小可部署单元&#xff0c;他包含一个或多个相关容器。这些容器共享网络命名空间和存储卷&#xff0c;他们通常协同工作来构成一个应用程序。 Serv…

微信小程序处理交易投诉管理,支持多小程序

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…

哪款百元头戴式耳机性价比高?四款大火爆全网的机型盘点推荐!

在繁忙的生活节奏中&#xff0c;寻找一片属于自己的宁静空间&#xff0c;成为了许多人的内心渴望。头戴式降噪耳机&#xff0c;正是那把打开音乐世界的钥匙。它不仅能够隔绝外界的喧嚣&#xff0c;还能将您带入一个纯净无瑕的音乐世界。无论是沉浸在古典乐的悠扬旋律中&#xf…

66 使用注意力机制的seq2seq_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录动机加入注意力总结代码定义注意力解码器训练小结练习 我们来真的看一下实际应用中&#xff0c;key&#xff0c;value&#xff0c;query是什么东西&#xff0c;但是取决于应用场景不同&#xff0c;这三个东西会产生变化。先将放在seq2seq这个…

平面电磁波的电场能量磁场能量密度相等,能量密度的体积分等于能量,注意电场能量公式也没有复数形式(和坡印廷类似)

1、电场能量密度和磁场能量密度相等(实数场算的) 下面是电场能量密度和磁场能量密度的公式&#xff0c;注意这可不是坡印廷定理。且电场能量密度没有复数表达式&#xff0c;即不是把E和D换成复数形式就行的。注意&#xff0c;一个矢量可以转化为复数形式&#xff0c;两个矢量做…