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

MySQL数据库 - 索引(上)

目录

1 简介

1.1 索引是什么

1.2 为什么要使用索引

2 索引应该选择哪种数据结构

2.1 HASH

2.2 二叉搜索树

2.3 N叉树(B树)

2.4 B+树

3 MySQL的页

3.1 为什么要使用页

3.2 页文件头和页文件尾 

3.3 页主体

3.4 页目录

4 B+树在MySQL索引中的应用

5 索引分类

5.1 主键索引

5.2 普通索引

5.3 唯一索引

5.4 全文索引

5.5 聚集索引

5.6 非聚集索引

5.7 索引覆盖


1 简介

1.1 索引是什么

MySQL的索引是一种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过对索引的搜索来加快速度。

MySQL索引类似于书籍的目录,通过指向数据行的位置,可以高速定位和访问表中的数据,比如汉语字典中的目录(索引)页,我们可以按笔画、偏旁部首、拼音等排序的目录(索引)快速查找到需要的字。

1.2 为什么要使用索引

显而易见,使用索引的目的只有一个,就算提升数据检索的效率,在应用程序运行的过程中,查询操作的频率远远高于增删查改的频率。

2 索引应该选择哪种数据结构

2.1 HASH

时间复杂度:O(1)  ,是最重要的数据结构,没有之一。

缺点:不支持范围查找。

MySQL没有采用此数据结构。

2.2 二叉搜索树

中序遍历是一个有序序列--->支持范围查找

时间复杂度:O(n)

缺点:

节点个数过多时,无法保证树高。

由于数据库上的数据都是在磁盘中保存的,每一次访问子节点都会都会发生一次磁盘IO

磁盘IO是制约数据库性能的主要因素。

因此数据库没有采用二叉搜索树的数据结构。

2.3 N叉树(B树)

N叉树每个节点都可以有超过两个的子节点,可以解决树高问题。

时间复杂度:O(logN)

在数据量相同的情况下,可以有效控制树高,也就是可以使用更少的IO找到目标节点,从而提高数据库的效率。

然而MySQL并没有采用此数据结构。

2.4 B+树

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

时间复杂度:O(logN)

优点:可以有效控制树高

B+树与B树对比:

1.叶子节点之间有一个相互连接的引用,可以通过一个叶子节点找到它相信的兄弟节点。

MySQL在组织叶子节点时使用的是双向链表。

2.非叶子节点的值都保存在叶子节点中。

MySQL非叶子节点只保存了对叶子节点的引用,没有保存真实的数据,所有真实的数据都保存在叶子节点中。

3.对于B+树而言,在相同树高的情况下,查找任一元素的时间复杂度都一样,性能均衡。

3 MySQL的页

3.1 为什么要使用页

.ibd文件中最重要的结构体就是Page(页),页是内存与磁盘交互的最小单元默认大小为16KB,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的,之所以这样做,是因为在使用数据的过程中,根据局部性原理,将来要使用的数据大概率与当前访问的数据在空间上是临近的,所以一次从磁盘中读取一页的数据放入内存中,当下次查询的数据还在这个页中时就可以从内存中直接读取,从而减少磁盘I/O,提高性能。


MySQL每创建一张表,就会生成一个.ibd文件。这个.ibd文件被称为独立表空间文件。

MySQL中有很多页类型,这里只讨论数据页(或者叫做索引页

3.2 页文件头和页文件尾 

页文件头和页文件尾中包含的信息,如下图所示:

这里我们只关注,上一页页号和下一页页号,通过这两个属性可以把页与页之间链接起来,形成一个双向链表。

通过页号和页大小,可以计算出下一页和上一页在磁盘上的偏移量(或者叫地址)

3.3 页主体

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

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

3.4 页目录

分组:数据行的的分组,每个分组最多可以容纳8条记录,超过8条记录时会分裂出来一个新的组。

注意:最小行单独为一个组,最大行永远在最后一个组。

创建分组时会在页目录中创建一个槽,槽的数量与分组的数量一致,槽会指定对应分组的最后条记录,同时保存这条记录的主键值。

查询某条记录的步骤:

1.首先要找到这个记录所在的页

2.在页中找到所在的槽

3.在分组中找到对应的记录

4 B+树在MySQL索引中的应用

非叶子节点保存索引数据,叶子节点保存真实数据,如下图所示:

以查找id为5的记录,完整的检索过程如下:

1.首先判断B+树的根节点中的索引记录,此时5<7,应访问左孩子节点,找到索引页2.

2.在索引页2中判定id大小,找到与5对等的记录,命中,

以上的IO过程:加载索引页1 -->加载索引页2 -->加载数据页3

共三次IO

5 索引分类

5.1 主键索引

当在一个表上定义一个主键时,该表会自动创建索引,索引的值是主键列的值,InnoDB使用它作为聚集索引(或者叫聚簇索引)。

推荐为每个表定义一个主键。如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加一个自增列。

5.2 普通索引

最基本的索引类型,没有唯一性的限制。

可能为多列创建组合索引,称为复合索引或组全索引

5.3 唯一索引

当在一个表上定义一个唯一键UNIQUE时,自动创建唯一索引。

与普通索引类似,但区别在于唯一索引的列不允许有重复值。

5.4 全文索引

基于文本列(CHAR、VARCHAR或TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作

用于全文搜索,仅MyISAM和InnoDB引擎支持。

5.5 聚集索引

与主键索引是同义词。

如果没有为表定义PRIMARY KEY,InnoDB使用第一个UNIQUENOT NULL的列作为聚集索引。

如果表中没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会为新插入的行生成一个行号并用6字节的ROW_ID字段记录,ROW_ID单调递增,并使用ROW_ID作为索引。

(ROW_ID是数据行中的一个隐藏列之一)

5.6 非聚集索引

聚集索引以外的索引称为非聚集索引二级索引

二级索引中的每条记录都包含该列的主键列,以及二级索引指定的列。

InnoDB使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询。

5.7 索引覆盖

当一个select语句使用了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列,这时就可以直接返回数据,而不用回表查询,这样的现象称为索引覆盖。


如果哪里有疑问的话欢迎来评论区指出和讨论,如果觉得文章有价值的话就请给我点个关注还有免费的收藏和赞吧,谢谢大家!

相关文章:

MySQL数据库 - 索引(上)

目录 1 简介 1.1 索引是什么 1.2 为什么要使用索引 2 索引应该选择哪种数据结构 2.1 HASH 2.2 二叉搜索树 2.3 N叉树&#xff08;B树&#xff09; 2.4 B树 3 MySQL的页 3.1 为什么要使用页 3.2 页文件头和页文件尾 3.3 页主体 3.4 页目录 4 B树在MySQL索引中的应…...

redis与springBoot整合

前提 要实现,使用Redis存储登录状态 需要一个完整的前端后端的项目 前端项目搭建 解压脚手架 安装依赖 配置请求代理 选做: 禁用EsLint语法检查 Vue Admin Template关闭eslint校验&#xff0c;lintOnSave&#xff1a;false设置无效解决办法_lintonsave: false-CSDN博客 …...

YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV9模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…...

消防应急物资仓库管理系统

集驰电子消防装备仓库管理系统(DW-S302系统)是一套成熟系统&#xff0c;依托3D技术、大数据、RFID技术、数据库技术、对装备器材进行统一管理&#xff0c;以RFID射频识别技术为核心&#xff0c;构建以物资综合管理为基础&#xff0c;智能分析定位为主要特色功能的装备器材库综合…...

【论文阅读】Semi-Supervised Few-shot Learning via Multi-Factor Clustering

通过多因素聚类的半监督小样本学习 引用&#xff1a;Ling J, Liao L, Yang M, et al. Semi-supervised few-shot learning via multi-factor clustering[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022: 14564-14573. 论文地址…...

第十三章 RabbitMQ之消息幂等性

目录 一、引言 二、消息幂等解决方案 2.1. 方案一 2.2. 方案二 一、引言 幂等是一个数学概念&#xff0c;用函数表达式来描述是这样的&#xff1a;f(x) f(f(x)) 。在程序开发中&#xff0c;则是指同一个业务&#xff0c;执行一次或多次对业务状态的影响是一致的。有些业务…...

tpcms-master.zip

网盘&#xff1a;https://pan.notestore.cn/s.html?id34https://pan.notestore.cn/s.html?id34...

Spring国际化和Validation

SpringBoot国际化和Validation融合 场景 在应用交互时&#xff0c;可能需要根据客户端得语言来返回不同的语言数据。前端通过参数、请求头等往后端传入locale相关得参数&#xff0c;后端获取参数&#xff0c;根据不同得locale来获取不同得语言得文本信息返回给前端。 实现原…...

②EtherCAT转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherCAT 转 Modbus TCP (接上一章&#xff09; GW系列型号 配置说明 上载 网线连接电脑到模块上的 WEB 网页设置网口&#…...

【华为HCIP实战课程八】OSPF网络类型及报文类型详解,网络工程师

一、点到点网络类型 1、两台路由器 2、支持广播、组播 P2P(PPP、HDLC、帧中继子接口) 我们需要三个维度考虑 A、是否自动通过组播发现邻居 B、时间(Hello和Dead) C、DR和BDR----多点接入网络需要用到(广播和NBMA) 点到点是组播自动发现邻居,Hello 10S,Dead 40S…...

信息安全工程师(28)机房安全分析与防护

前言 机房安全分析与防护是一个复杂而细致的过程&#xff0c;涉及到物理安全、环境控制、电力供应、数据安全、设备管理、人员管理以及紧急预案等多个方面。 一、机房安全分析 1. 物理安全威胁 非法入侵&#xff1a;未经授权的人员可能通过门窗、通风口等进入机房&#xff0c;…...

大数据处理从零开始————9.MapReduce编程实践之信息过滤之学生成绩统计demo

1.项目目标 1.1 需求概述 现在我们要统计某学校学生的成绩信息&#xff0c;筛选出成绩在60分及以上的学生。 1.2 业务分析 如果我们想实现该需求&#xff0c;可以通过编写一个MapReduce程序&#xff0c;来处理包含学生信息的文本文件&#xff0c;每行包含【学生的姓名&#x…...

自动化测试 | 窗口截图

driver.get_screenshot_as_file 是 Selenium WebDriver 的一个方法&#xff0c;它允许你将当前浏览器窗口&#xff08;或标签页&#xff09;的截图保存为文件。这个方法对于自动化测试中的截图验证非常有用&#xff0c;因为它可以帮助你捕获测试执行过程中的页面状态。 以下是…...

初中数学网上考试系统的设计与实现(论文+源码)_kaic

初中数学网上考试系统的设计与实现 学生&#xff1a; 指导教师&#xff1a; 摘 要&#xff1a;科技在人类的历史长流中愈洗愈精&#xff0c;不仅包括人们日常的生活起居&#xff0c;甚至还包括了考试的变化。之前的考试需要大量的时间和精力&#xff0c;组织者还需要挑选并考查…...

关系运算(3)

关系代数 昨天讲完附加关系代数运算&#xff0c;今天讲扩展关系代数运算。 扩展代数运算 正如其名&#xff0c;这种运算定义了前面基本和附加都没有的运算。 去重运算 可以将关系R中跟查询条件相关但是形成了重复的元组去除&#xff0c;只保留查询结果&#xff08;简洁&…...

tp6的系统是如何上架的

TP6&#xff08;ThinkPHP6&#xff09;的系统上架过程&#xff0c;通常指的是将基于ThinkPHP6框架开发的应用程序部署到生产环境&#xff0c;并使其可以通过互联网访问。以下是一个大致的上架流程&#xff0c;包括准备工作、部署步骤以及后续维护等方面&#xff1a; 一、准备工…...

Vue:开发小技巧

目录 1. Table表格偏移 1. Table表格偏移 通过设置自小的宽度进行控制 :min-width <el-table-column label"操作" align"center" class-name"small-padding fixed-width" fixed"right" min-width"150px"><templa…...

力扣之1369.获取最近第二次的活动

题目&#xff1a; sql建表语句 Create table If Not Exists UserActivity (username varchar(30), activity varchar(30), startDate date, endDate date); Truncate table UserActivity; insert into UserActivity (username, activity, startDate, endDate) values (Alic…...

Python 和 Jupyter Kernel 版本不一致

使用jupyter notebook时明明已经安装了包&#xff0c;但是导入时提示&#xff1a; ModuleNotFoundError: No module named ptitprince 1、检查安装环境 !pip show ptitprince Name: ptitprince Version: 0.2.7 Summary: A Python implementation of Rainclouds, originally…...

Android常用布局

目录 布局文件中常见的属性 1. 基本布局属性 1&#xff09;android:layout_width 2&#xff09;android:layout_height 3&#xff09;android:layout_margin 4&#xff09;android:padding 2. 线性布局 (LinearLayout) 属性 1&#xff09;android:orientation 2&#xff09;and…...

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图&#xff1a;1.1.2、 LSW11.1.3、 LSW2 1.2、…...

JavaScript轮播图实现

这个代码创建了一个简单的轮播图&#xff0c;可以通过点击左右箭头或自动播放来切换图片。 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>js轮播图练习</title><style>.box {width: 60vw;height: 500px;m…...

【LLM开源项目】LLMs-开发框架-Langchain-Tutorials-Basics-v2.0

【1】使用LCEL构建简单的LLM应用程序(Build a Simple LLM Application with LCEL) https://python.langchain.com/docs/tutorials/llm_chain/ 如何使用LangChain构建简单的LLM应用程序。功能&#xff1a;将把文本从英语翻译成另一种语言。 实现&#xff1a;LLM调用加上一些提…...

Python 爬取天气预报并进行可视化分析

今天&#xff0c;我们就来学习如何使用 Python 爬取天气预报数据&#xff0c;并用数据可视化的方式将未来几天的天气信息一目了然地展示出来。 在本文中&#xff0c;我们将分三步完成这一任务&#xff1a; 使用 Python 爬取天气数据数据解析与处理用可视化展示天气趋势 让我…...

最左侧冗余覆盖子串

题目描述 给定两个字符串 s1 和 s2 和正整数 k&#xff0c;其中 s1 长度为 n1&#xff0c;s2 长度为 n2。 在 s2 中选一个子串&#xff0c;若满足下面条件&#xff0c;则称 s2 以长度 k 冗余覆盖 s1 该子串长度为 n1 k 该子串中包含 s1 中全部字母 该子串每个字母出现次数…...

性能测试-JMeter(2)

JMeter JMeter断言响应断言JSON断言断言持续时间 JMeter关联正则表达式提取器正则表达式正则表达式提取器 XPath提取器JSON提取器 JMeter属性JMeter录制脚本 JMeter断言 断言&#xff1a;让程序自动判断预期结果和实际结果是否一致 提示&#xff1a; -Jmeter在请求的返回层面有…...

芯课堂 | Synwit_UI_Creator(μgui)平台之图像处理篇

今天小编给大家介绍的是UI_Creator&#xff08;μgui&#xff09;平台下关于图像处理的选项。 UI_Creator&#xff08;μgui&#xff09;平台图片类控件有图像控件和分级图像控件&#xff0c;均包含以下选项&#xff1a; 1、消除水波纹&#xff1a; 由于16位真彩色&#xff08…...

QT C++ 软键盘/悬浮键盘/触摸屏键盘的制作

目录 1、前言 2、界面设计 3、英文、数字的输入 4、符号的输入 5、中文的输入 6、中文拼音库的选择 7、其他 8、结语 1、前言 使用QT C在带显示器的Linux系统 开发板上&#xff08;树莓派等&#xff09;编写操作UI界面时&#xff0c;很多时候都需要一个软键盘来输入文字…...

element-ui点击文字查看图片预览功能

今天做一个点击文字查看图片的功能&#xff0c;大体页面长这样子&#xff0c;点击查看显示对应的图片 引入el-image-viewer&#xff0c;点击的文字时候设置图片预览组件显示并传入图片的地址 关键代码 <el-link v-if"scope.row.fileList.length > 0" type&…...

SpringBoot集成Redis使用Cache缓存

使用SpringBoot集成Redis使用Cache缓存只要配置相应的配置类&#xff0c;然后使用Cache注解就能实现 RedisConfig配置 新建RedisConfig配置类 package com.bdqn.redis.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annota…...