索引的介绍
目录
1.索引的介绍
1.1 什么是索引
1.2 为什么要使用索引
2.索引应该选择哪种数据结构
3.MYSQL中的页
3.1为什么要使用页
3.2页文件头和页文件尾
3.3 页主体
3.3页目录
3.4数据页头
4.B+在MYSQL索引中的应用
4.1计算三层树高的B+树可以存放多少条记录
5.索引分类
5.1 主键索引
5.2普通索引
5.3 唯一索引
5.4 全文索引
5.5 聚集索引
5.6 非聚集索引
5.7索引覆盖
1.索引的介绍
1.1 什么是索引
MYSQL的索引是一种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得表的查询可以通过对索引的搜索来加快速度。MYSQL索引类似于书籍的目录,通过指向数据行的位置,可以快速定位和访问表中的数据,比如汉语字典的目录页,我们可以按照笔画、偏旁部首、拼音等的目录(索引)快速查找需要的字。
1.2 为什么要使用索引
使用索引的目的只有一个,就是提升数据检索的效率,在应用程序的运行过程中,查询操作的频率远远高于增删该的评率
2.索引应该选择哪种数据结构
- HASH
时间复杂度:O(1)
HASH是将存储的元素通过hash函数(存储位置 = 存储元素 % 容量 )找到存储位置使它们之间形成一种映射关系,查找的时候也是将查找的元素进行hash来查找元素,因此不支持范围查找。
最重要的数据结构没有之一,但是不支持范围查找
- 二叉搜索树
时间复杂度 最好为:O(logN)最坏为一个单边树:O(N)
二叉搜索树的查找是先与根节点比较,再决定是往左还是往右查找。中序遍历是一个有序序列同时支持范围查找 ,但是可能会退化一个单边树使节点数过多让时间复杂度变为最坏情况
使得每次访问子节点都会发生一次磁盘 IO,磁盘IO是制约数据库性能的主要因素
- N叉树
时间复杂度为:O(logN)
N叉树每个节点可以有超过两个的子节点,可以解决树的高度问题。同时,在数据量相同的情况下,可以有效的控制树的高度,也就是说可以使用更少的IO次数找到目标节点,从而提高数据库的效率
N树的介绍

以上的数字称为度或阶,该数字表示每一个节点最多有多少个子节点,一般子节点的个数小于度的值,如果数字为四最多有三个节点
例如:度为3时先插入两个节点如图所示,接着插入40时变成第二副图



- B+树
B+数绍
B+树是一种经常用于数据库和文件系统等场合的平衡查找树,MYSQL索引采用的数据结构,以4阶B+树为例,如图所示:



时间复杂度:O(logN)
优点:可以有效的控制树高
B+树与B树对比
1. B+树叶子节点之间有一个相互连接的引用,可以通过一个叶子节点找到它相信的兄弟节点
MYSQL在组织叶子节点时使用的是双向链表
2. B+树非叶子节点的值都包含在叶子节点中
MYSQL非叶子节点只保存了对叶子节点的引用,没有保存真实的数据,所有真实的数据 都保存在叶子节点中
3. 对于B+树而言,在相同树高的情况下,查找任意元素的时间复杂度都一样,性能均衡
3.MYSQL中的页
3.1为什么要使用页
在.ibd文件中最重要的结构体就是页,页是内存与磁盘交互的最小单位,默认大小为16KB,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,之所以这样做,是因为使用数据的过程中,根据局部性原理,将来要使用的数据大概率与之前访问的数据在空间上是临近的,所以一次从磁盘中读取一页的数据放入内存中,下次查询的数据还在这个页中时就可以从内存中直接读取,从而减少磁盘IO提高性能

16384(字节)/1024 = 16KB(1024个字节 = 1KB)


MYSQL中有很多页类型,这里只讨论数据页或称为索引页

3.2页文件头和页文件尾
页文件头和页文件尾中包含的信息,如下图所示:当前页文件的主要信息,这里我们只关注上一页页号和下一页页号,通过这两个属性可以把页与页之间连接起来,形成一个双向链表。

3.3 页主体
页主体部分是保存真实数据的主要区域,每当创建一个新页,都会自动分配两个行,一个是页内最小行Infimun,另一个是页内最大行Supremun,这两个行并不储存任何真实信息,而是做为数据行链表的头和尾,第一个数据行有一个记录下一行的地址偏移量的区域next_record将页内所有数据行组成一个单向链表,此时新页的结构如下所示:

当向一个新页插入数据时,将Infimun连接第一个数据行,最后一行真实数据行连接连接Supremun,这样数据行就构成了一个单向链表,更多的行数据插入以后,会按照主键从小到大的顺序进行连接,如上图所示。
3.3页目录

3.4数据页头
数据页头记录了当前页保存数据相关的信息,如下图所示

4.B+在MYSQL索引中的应用
非叶子节点保存索引数据,叶子节点保存真实数据,如下图所示

4.1计算三层树高的B+树可以存放多少条记录
理论上:
一个数据页默认16KB,假设一条数据1KB,一页中至多可以存16条数据

- 假设⼀条⽤⼾数据⼤⼩为1KB,在忽略数据⻚中数据⻚⾃⾝属性空间占⽤的情况下,⼀⻚可以存16 条数据
- 索引⻚⼀条数据的⼤⼩为,主键⽤BIGINT类型占8Byte,下⼀⻚地址6Byte,⼀共是14Byte,⼀个 索引⻚可以保存 16*1024/14 = 1170 条索引记录
- 如果只有三层树⾼的情况,综合只保存索引的根节点和⼆级节点的索引⻚以及保存真实数据的数据 ⻚,那么⼀共可以保存 1170*1170*16 = 21,902,400 条记录,也就是说在两千多万条数据的 表中,可以通过三次IO就完成数据的检索

5.索引分类
5.1 主键索引
- 当在一个表上定义一个主键PRIMARY KEY时(自动创建索引,索引的值是主键列的值),InnoDB使用它作为聚集索引。
- 推荐为每个表定义的一个主键。如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加一个自增例。
5.2普通索引
- 最基本的索引类型,没有唯一性的限制。
- 可能为多列创建组合索引,称为复合索引或组全索引(创建索引之后会生成一颗索引树,创建多少索引生成多少棵索引树)
为了提升查询效率。工作中通常为查询频繁的列创建索引,列的重复度不高可以包含一个列也可以包含多个列
5.3 唯一索引
- 当在一个表上定义一个唯一键UNQUE时,自动创建唯一索引。
- 与普通索引类似,但区别在于唯一索引的列不允许有重复值。
5.4 全文索引
- 基于文本列(CHAR、VARCHAR 或 TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作
- 用于全文搜索,仅MylSAM和InnoDB引擎支持
5.5 聚集索引
- 与主键索引是同义词
- 如果没有为表定义PRIMARY KEY,InnoDB使用第一个UNIOUE和NOT NULL的列作为聚集索引
- 如果表中没有PRIMARY KEY 或者合适的 UNIOUE 索引,InnoDB会为新插入的行生成一个行号并用6字节的ROW_ID(数据行中的一个隐藏列之一)单调递增,并使用ROW_ID做为索引。
5.6 非聚集索引
- 聚集索引以外的索引称为非聚集索引或者二级索引
- 二级索引中的每条记录都包含该行的主键列,以及二级索引指定的列
- InnoDB使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询
5.7索引覆盖
当一个select语句使用普通索引且查询列表的列刚好是创建普通索引时的所有或部分列,这时就可以直接返回数据,而不是用回表查询,这样的现象称为索引覆盖
相关文章:
索引的介绍
目录 1.索引的介绍 1.1 什么是索引 1.2 为什么要使用索引 2.索引应该选择哪种数据结构 3.MYSQL中的页 3.1为什么要使用页 3.2页文件头和页文件尾 3.3 页主体 3.3页目录 3.4数据页头 4.B在MYSQL索引中的应用 4.1计算三层树高的B树可以存放多少条记录 5.索引分类 5.1 主…...
Web后端服务平台解析漏洞与修复、文件包含漏洞详解
免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《中华人民共和国网络安全法》及其所在国…...
树莓派介绍与可安装的操作系统
引言 自 2012 年问世以来,树莓派(Raspberry Pi) 已成为全球最受欢迎的微型单板计算机之一。最初,树莓派的目标是为学校和发展中国家的学生提供一个廉价的计算平台,以促进计算机科学教育。然而,凭借其低成本…...
Qt常用控件——QTextEdit
文章目录 QTextEdit核心属性和信号同步显示示例信号示例 QTextEdit核心属性和信号 QTextEdit表示多行输入框,是一个富文本和markdown编辑器,并且能在内存超出编辑框范围时自动提供滚动条。 QPlainTexEdit是纯文本,QTextEdit不仅表示纯文本&a…...
docker-compose 部署 flink [支持pyflink]
下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…...
C++中string类的模拟实现
目录 1.string类的结构 2.默认成员函数 2.1.默认构造函数 2.2拷贝构造函数 2.3赋值运算符重载 2.4析构函数 3.迭代器(Iterators) 4.string类的空间操作(Capacity) 4.1size() 4.2capacity() 4.3clear() 4.4reserve() 5.元素访问(Element access) 6.string类的修…...
C++函数在库中的地址
本文讲述C如何直接调用动态库dll或者so中的函数。 首先我们准备一个被调用库,这个库里面有两个函数,分别是C98 与 C11 下的,名称是run2和run1。 被调用库 相关介绍请看之前的文章《函数指针与库之间的通信讲解》。 //dll_ex_im.h #ifndef…...
图像生成大模型imagen
要生成图像,可以使用深度学习模型,比如 OpenAI 的 DALLE、Google 的 Imagen 等。由于这些模型通常需要较大的计算资源和训练数据,下面是一些如何使用这些模型的基本步骤和方法。 使用预训练图像生成模型 选择模型: 常用的模型包括…...
Redis集群知识及实战
1. 为什么使用集群 在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。我们知道只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,是不是就可以缓解写压力了呢&…...
数据报表轻松管理,强大“后台”不可少
在数据驱动的时代,制作一份高效、精准的数据报表成为企业管理和决策的重要手段。但要做好数据报表,不仅需要一款功能强大的报表工具,还必须有一个强有力的“后台”管理系统来支撑。那么,为什么报表工具需要一个管理后台࿱…...
简易CPU设计入门:本CPU项目的指令格式
在这一节里面,主要是理论知识,基本上不讲代码。不过,本项目的代码包,大家还是需要下载的。 本项目的代码包的下载方法,参考下面的链接所指示的文章。 下载本项目代码 本节,其实是要讲本项目CPU的指令集。…...
Datawhile 组队学习Tiny-universe Task01
Task01:LLama3模型讲解 仓库链接:GitHub - datawhalechina/tiny-universe: 《大模型白盒子构建指南》:一个全手搓的Tiny-Universe 参考博客:LLaMA的解读与其微调(含LLaMA 2):Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子…...
MCU与SOC的区别
自动驾驶中 MCU 与 SoC 的区别 在自动驾驶系统中,**MCU(微控制单元,Microcontroller Unit)和SoC(系统级芯片,System on Chip)**都是关键的电子元件,但它们在性能、功能和应用领域等…...
51单片机-DS18B20(温度传感器)AT24C02(存储芯片) IIC通信-实验2-温度实时监测(可设置阈值)
作者:王开心 座右铭:刻苦专研,百折不挠,千磨万击还坚韧,任尔东西南北风!干就完了!(可交流技术) 主要利用DS18B20芯片去采集温度,通过采集的温度能够自动保存…...
Vue2接入高德地图API实现搜索定位和点击获取经纬度及地址功能
目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 一、申请密钥 登录高德开放平台,点击我的应用,先添加新应用,然后再添加Key。 如图所示填写对应的信息,系统就会自动生成。 二、安装…...
msvcp140.dll丢失如何解决?msvcp140.dll丢失的多种解决方法
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行,给用户带来很大的困扰。那么,当我们遇到msvcp140.dll丢失的情况时,应该如何解决呢&a…...
高效财税自动化软件如何提升企业财务工作的效率与准确性
在当今企业运营中,财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策,还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战,财务管理亟需进行持续的转型与提升,为企业高质量发展目标的实现…...
Leetcode 3286. Find a Safe Walk Through a Grid
Leetcode 3286. Find a Safe Walk Through a Grid 1. 解题思路2. 代码实现 题目链接:3286. Find a Safe Walk Through a Grid 1. 解题思路 这一题的话思路上就是一个宽度优先遍历,我们按照health进行排序进行宽度优先遍历,看看在health被消…...
shell脚本语法
shell脚本的变量 系统变量 系统变量是操作系统用来存储配置信息的变量,它们可以控制操作系统的行为和程序的运行环境。系统变量的种类和内容取决于操作系统的类型和版本。以下是一些常见的系统变量类别和它们可能包含的内容: 环境变量:这些…...
TCP 拥塞控制:一场网络数据的交通故事
从前有条“高速公路”,我们叫它互联网,而这条公路上的车辆,则是数据包。你可以把 TCP(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
