索引的介绍
目录
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(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...