当前位置: 首页 > news >正文

索引的介绍

目录

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 主键索引

  1. 当在一个表上定义一个主键PRIMARY KEY时(自动创建索引,索引的值是主键列的值),InnoDB使用它作为聚集索引。
  2. 推荐为每个表定义的一个主键。如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加一个自增例。

5.2普通索引

  1. 最基本的索引类型,没有唯一性的限制。
  2. 可能为多列创建组合索引,称为复合索引或组全索引(创建索引之后会生成一颗索引树,创建多少索引生成多少棵索引树)

为了提升查询效率。工作中通常为查询频繁的列创建索引,列的重复度不高可以包含一个列也可以包含多个列

5.3 唯一索引

  1. 当在一个表上定义一个唯一键UNQUE时,自动创建唯一索引。
  2. 与普通索引类似,但区别在于唯一索引的列不允许有重复值。

5.4 全文索引

  1. 基于文本列(CHAR、VARCHAR 或 TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作
  2. 用于全文搜索,仅MylSAM和InnoDB引擎支持

5.5 聚集索引

  1. 与主键索引是同义词
  2. 如果没有为表定义PRIMARY KEY,InnoDB使用第一个UNIOUE和NOT NULL的列作为聚集索引
  3. 如果表中没有PRIMARY KEY 或者合适的 UNIOUE 索引,InnoDB会为新插入的行生成一个行号并用6字节的ROW_ID(数据行中的一个隐藏列之一)单调递增,并使用ROW_ID做为索引。

5.6 非聚集索引

  1. 聚集索引以外的索引称为非聚集索引或者二级索引
  2. 二级索引中的每条记录都包含该行的主键列,以及二级索引指定的列
  3. 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节点。当并发写请求较大时,哨兵模式并不能缓解写压力。我们知道只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,是不是就可以缓解写压力了呢&…...

数据报表轻松管理,强大“后台”不可少

在数据驱动的时代,制作一份高效、精准的数据报表成为企业管理和决策的重要手段。但要做好数据报表,不仅需要一款功能强大的报表工具,还必须有一个强有力的“后台”管理系统来支撑。那么,为什么报表工具需要一个管理后台&#xff1…...

简易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(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...