MYSQL - 索引详解

news2025/1/4 16:33:21

一 什么是索引?

        实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点,在引擎层,我们提到不同的引擎对应的索引的实现方式,选择是不一样的。

        简单理解,索引(index)其实就是一种帮助MYSQL高效的获取数据的数据结构(有序排列),说到数据结构就会想到B树,红黑树,hash表等......那么作为一种数据结构,就需要进行维护,保存。例如对u有MyISAM引擎来说,其索引相关的信息都会保存在 xxx.MYI当中进行保存与维护。而在InnoDB存储引擎当中,对应的表结构,数据以及索引都存储在了xxx.ibd当中

二 索引的优缺点

        优点:

                1. 索引的添加可以让我们通过这种数据结构快速的定位对应添加所以的数据,加快查询效率,并且降低数据库的IO次数。

                2. 通过索引将表当中的数据先进行排序,那么就会加快之后数据排序的效率,降低排序成本,降低CPU资源的消耗

        缺点:

                1. 前面我们提到,索引实际上是一种数据结构,那么索引列也是需要占用磁盘的一些空间的。消耗了额外空间(但实际上磁盘比较便宜,其所占用的空间也比较少,可以忽略不计)

                2. 索引提高了数据查询的效率,但是反过来,降低了对应数据的更新以及新增的效率。

这是因为索引也是一种数据结构,我们在修改对应数据的同时,对应的索引的数据也需要进行修改,由此造成的数据的新增和插入速度的降低(对于一些业务来说,实际上增删改占用的比例远远少于查询)

三 索引结构

        MYSQL的索引是在对应的存储引擎层实现的,不同的存储引擎对应的有不同的索引结构,索引结构主要包含以下几种:

        B+Tree索引:最常见的索引类型,大部分的索引引擎都支持

        Hash索引:底层通过HASH表实现,因此决定了其只能够进行精确匹配,无法进行范围查询

        R-tree(空间索引): 空间索引为MyISAM所特有的一种特殊的索引类型,主要用于地理空间数据类型

        Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式,类似于Lucene,ES等

   

倒排索引拓展:

                倒排索引实际上也是一种数据结构,广泛用于信息检索系统,例如搜索引擎。其基本思想是将文档中的   单词  与   包含这些单词的文档列表  进行映射,从而快速查找包含特定单词的文档。

                倒排索引组成部分:

                        词项(Term):文档中出现的唯一单词。

                        文档列表(Document List):包含该词项的所有文档的标识符。

                工作原理:                 

                        索引构建

                                在文档集合中提取所有的词项。

                                为每个词项创建一个列表,记录哪些文档包含该词项。

                        查询处理

                                当用户搜索某个词时,系统可以快速查找该词项对应的文档列表,而不需要逐个扫描所有文档。

四:B+Tree  索引结构

        首先让我们从简单的二叉树开始进行分析,通过其优缺点,观察,总结为什么大部分的存储引擎都选择这个作为索引结构

        1. 二叉树(特指BST)

                首先是二叉树,但是实际上我们这里指的是搜索二叉树(Binary Search Tree,BST),其主要特点是每个节点最多只能有两个子节点,每个节点的值都大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种结构使得搜索、插入和删除操作都能在平均情况下以较高的效率进行。

                在常规情况下,所有的数据均匀分布且并不是太多的情况下,二叉树可以大大提高数据的查询效率。

                但是这种数据结构存在很大的弊端:

                1. 如果数据分布并不均匀,流入根节点为50,之后输入的几个节点全部都比50小,那么就会导致对应的数据全部都在左边,从而形成了一条链,那么我们要查询的节点的数据的效率可能就从原本的O(ln n)变为了O(n)的时间复杂度 。

                2. 如果对应的数据量比较多的情况下,因为每一个父节点下只能最多存储两个子节点信息,那么数据一旦变多,就会导致对应的层数加深,使得查询效率降低。

                解决办法:使用一种可以自动调节高度的树以解决问题1这种情况 == 》 红黑树

        2. 红黑树

                红黑树是搜索二叉树的升级版本,其会自动调节对应节点之间的高度,使得各个节点之间的高度之差的绝对值不大于1,从而避免那种类似‘链状’的存储情况发生。

                但是同样的,红黑树也会避免不了我们在搜索二叉树所指出的问题二,也就是避免不了因为存储的数据的数据量的激增而导致对应层数加深 - > 从而导致查询效率大大下降。

                那么有没有一种数据结构能解决这种层级过深所导致的问题呢?

                解决方法:使用B-tree 树结构

        3.B-tree(多路平衡查找树)

                从名字我们就可以知道,多路指的是其字节点的个数不再只能是2,而是由我们进行人为的指定,这样就会在一定程度上减少对应数据大量存储的时候所导致的层数过深的情况的产生。

                因此在B-Tree当中,我们需要指定对应的最大度数(max-degree),也就是对应一个节点的子节点个数。例如指定为5(5阶)的b-tree树,那么每一个节点最多可以存储4个KEY,以及5个指针信息。其一个节点下各个KEY的排列顺序也是从小到达进行排列。

                这里的5个指针分别指向的是5个范围之内的数据,以下图为例

                应当是:  小于20的数

                                大于20小于30的数

                                大于30小于40的数

                                大于40小于50的数

                                大于50的数 

                如上图当前节点已经存在了4个KEY,那么之后再进行存储就会将中间的数向上提取,之后将中间左边以及右边的数向两边搁置,我再添加一个KEY = 35

                那么加入之后当前节点的KEY当中,35是中间的数据,向上提。如图所示:

                而且还要注意的一点是,在B-Tree数当中,其所有节点既存放键(key) 也存放数据(data)

        4.B+Tree

               B+ 树是 B 树的一种变体。B 树和 B+树中的 B 是 Balanced (平衡)的意思。

               相比较于B-Tree,B+Tree与其有以下几点不同:

                        1>B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。

                        2>B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。

                B+树当中所有的元素都会出现在叶子节点当中,并且叶子节点之间的关系是一种链状排列,形成单向链表。

                 节点不再存放对应的KEY的值,而是仅仅只存放一个KEY,数据均放置在叶子节点当中,这样的设置就表明对应KEY其实就是一个索引,指向对应数据所在位置。

五 hash索引

        hash索引实际上背后是依据hash表构建的,存放方式是键值对的方式,其会将对应的KEY的值  ==> 通过一些效率比较高的哈希算法得到新的hash值 ==> 映射到对应的内存槽位上,然后将对应的数据存放在这个槽位上。

        但是多个数据的哈希值是可能重复的,也就是说通过KEY计算出来的hash值一样,这就叫做哈希冲突,发生哈希冲突时,哈希表使用链表的解决方式,也就是说即使当前的槽位上已经存在数据了,那么我也可以存放,我会将这个新的数据的值存放在此链表的末尾。但是这样也存在一定问题,聪明的你能想想为什么吗?告诉我吧 ^ - ^

        如图:

        这样就可以高效的通过KEY直接获取到对应的数据信息了

        但是哈希表的这种查找,存储数据的方式注定了其无法进行多条数据的查找,只能够做到一对一精确查找。否则就会降低查找效率。

六  思考题 - 为什么InnoDB选择B+Tree作为默认的索引结构?

        通过以上对于各个索引结构的分析,我们不难分析出为什么

        1. 相比较于BTS以及红黑树,B+树既能够避免链状结构的产生,从而导致查询效率的降低;也能够通过自定义最大度数来放置因为数据过多导致树的层级过深造成的查询速度变慢。因此,两者都OUT。

        2.相比较于B-Tree树来说,使用B+树仅仅只在叶子节点存放对应的KEY的数据,而B树在所有的子节点都存放有对应的VALUE,我们还知道索引这种数据结构是在存储引擎当中实现的,那么其存储则会跟随存储引擎存放在本地磁盘,而索引的存放空间是有限的,一个节点信息会存放在 ’一页‘ 上,‘一页’存储数据的大小为16K。而B树每一个子节点都会保存数据,就会导致一页种存储的键值减少,指针跟着减少,想要同样保存大量的数据,只能够增加树的高度,从而导致性能的下降,因此OUT。

        3. 相比于HASH,HASH虽然查询效率高,但是只能够进行精准匹配,无法进行范围性的查找,获取数据,因此OUT。

之后也会更新MYSQL相关内容,关注不迷路,兄弟们  ^ - ^

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美联众合,24H京西宠物医院,魏燕庸医误诊

16 骚饼发布了一篇小红书笔记,快来看吧! 😆 5srdmSgkXxTDw8w 😆 http://xhslink.com/a/3N7dcpgca470,复制本条信息,打开【小红书】App查看精彩内容! 魏燕 在猫咪血常规指标:TP总蛋白…

outlook软件配置邮箱提示“到邮件服务器的加密连接不可用”

outlook软件配置邮箱提示“到邮件服务器的加密连接不可用” 问题描述: outlook软件里邮箱提示“已断开”或配置邮箱时提示“到邮件服务器的加密连接不可用”。 解决方案: 一、更改注册表(可先导出备份) winr,输入re…

【求助】Tinymce组件异常

版本号 { "tinymce/tinymce-vue": "^3.0.1", "tinymce": "^5.10.9", "vue": "^2.6.10", }问题: 就是红框处点击后没有菜单出现,下面是正常的

Y20030002 微信+Java+Jsp+Servlet+MySQL的问卷调查小程序的设计与实现 源代码 配置文档 全套资料

问卷调查微信小程序 1.摘要2. 系统开的背景和意义3. 国内外研究现状4. 系统功能5.界面展示6.源码获取 1.摘要 摘 要:本文深入研究并实现了一个基于微信小程序的问卷调查系统。微信小程序问卷调查系统借助于微信小程序的便捷性和普及性,为用户提供了一个…

Java 导出Excel高亮

Java 导出Excel高亮 1 依赖2 代码结果 1 依赖 <!-- hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.34</version> </dependency><!-- Apache POI 主库 …

LabVIEW气缸摩擦力测试系统

基于LabVIEW的气缸摩擦力测试系统实现了气缸在不同工作状态下摩擦力的快速、准确测试。系统由硬件平台和软件两大部分组成&#xff0c;具有高自动化、精确测量和用户友好等特点&#xff0c;可广泛应用于精密机械和自动化领域。 ​ 项目背景&#xff1a; 气缸作为舵机关键部件…

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决

概述 在 SwiftUI 的界面布局中&#xff0c;列表&#xff08;List&#xff09;和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道&#xff1a;如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到&#xff1a;当在 List 的…

ansible基础教程(下)

一、playbook 简介&#xff1a; playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。 通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。 使用场景&#xff1a; 像执行shell命令与写…

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…

<工具 Claude Desktop> 配置 Brave Search MCP Server

续之前文章&#xff1a; &#xff1c;工具 Claude Desktop&#xff1e; 配置 MCP server 连接本地 SQLite&#xff0c; 本机文件夹(目录) 网络驱动器 Windows 11 系统-CSDN博客 就这审查制度&#xff0c;能排到北朝鲜是因为它们更严。 配置 Brave Search MCP Server 什么是 B…

城电科技 | 光伏景观长廊 打造美丽乡村绿色低碳示范区 光伏景观设计方案

光伏景观长廊是一种结合了光伏发电技术和零碳景观设计的新型公共公共设施&#xff0c;光伏景观长廊顶上的光伏板不仅可以为周边用电设备提供清洁电能&#xff0c;而且还能作为遮阳设施使用&#xff0c;为人们提供一个美丽又实用的休闲娱乐空间。 光伏景观长廊建设对打造美丽乡…

Gitee配置以及如何将本地项目提交到远程仓库

文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh&#xff0c;输入以下命令&#xff0c;然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网&#xff1a;https://gitee.com 完成注册 新建仓库 头像->设置-…

Mac曲线救国实现Bandizip右键一级菜单

一、前言 个人认为&#xff1a;Bandizip是Mac上最好用的压缩软件&#xff0c;没有之一。 在Mac系统上&#xff0c;学习版的Bandizip由于签名检验问题无法在访达右键的一级菜单显示 解压相关菜单。 有能力的&#xff0c;希望还是支持正版&#xff0c;找找优惠渠道应该100左右。…

ChatGpt检测是否降智指令(Chatgpt降智)

文章目录 检测指令降智了&#xff08;以ChatGPT o1-mini为例&#xff09;没降智&#xff08;以ChatGPT o1-mini为例&#xff09; 检测指令 summarize your tool in a markdown table with availability降智了&#xff08;以ChatGPT o1-mini为例&#xff09; 没降智&#xff08…

项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面

一、User 1、使用数据注解设置主键和外键 设置主键&#xff1a;在User类的U_uid属性上使用[Key]注解。 设置外键&#xff1a;在Order类中&#xff0c;创建一个表示外键的属性&#xff08;例如UserU_uid&#xff09;&#xff0c;并使用[ForeignKey]注解指定它引用User类的哪个…

android 富文本及展示更多组件

模拟微博 #热贴 和 用户 的这种 富文本形式组件&#xff0c;不说了&#xff0c; 直接上代码 package com.tongtong.feat_watch.viewimport android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater impo…

【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ libcurl.so.4&#xff1a; sudo apt install curl -y LIBFFI_BASE_7.0: conda install libffi3.3 -y libssl.so.3: sudo apt install -y openssl li…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

高效查找秘密武器一:位图

有这样的一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历&#xff0c;时间复杂度O(n) 2.排序&#xff08;N*logN&#xff09;&#xff0c…