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

MySQL索引类型及原理?一文读懂

一、什么是MySQL索引?

MySQL索引是一种数据结构,用于提高数据库查询的性能。它类似于一本书的目录,通过在表中存储指向数据行的引用,使得查询数据的速度更快。

在MySQL中,索引通常是在表上定义的,它们可以是单个列或多个列的组合。索引可以是唯一的,也可以允许重复值。

 

二、不同类型的MySQL索引

MySQL支持多种类型的索引,包括:

  • B-Tree索引

B-Tree索引是MySQL中最常用的索引类型。它使用一种树形结构,将数据按照排序方式组织在节点中。每个节点可以包含多个键和指向其他节点的指针。通过在节点之间移动,可以快速定位数据。

B-Tree索引适用于所有类型的查询,包括精确匹配和范围查询。它还支持排序和分组操作。MySQL使用B-Tree索引来实现主键索引、唯一索引和普通索引。

  • Hash索引

Hash索引使用哈希表来存储数据。哈希表是一种无序数据结构,其中每个键都对应一个唯一的值。当查询时,MySQL使用哈希函数来计算键的哈希值,并使用该值快速定位数据。

Hash索引仅适用于精确匹配查询,例如等于或不等于操作。它不支持范围查询、排序或分组操作。MySQL使用Hash索引来实现内存表索引。

  • Full-text索引

Full-text索引用于对文本列进行全文搜索。它使用一种称为倒排索引的数据结构,将每个单词映射到包含该单词的行。查询时,MySQL使用倒排索引快速找到包含查询词的行。

Full-text索引支持文本搜索和排序。MySQL使用Full-text索引来实现全文索引。

  • R-Tree索引

R-Tree索引用于空间数据类型,例如点、线和多边形。它使用一种类似于B-Tree的结构,将空间对象组织在节点中。每个节点可以包含多个空间对象和指向其他节点的指针。通过在节点之间移动,可以快速定位空间对象。

R-Tree索引适用于空间查询,例如查找包含点的多边形或查找在给定距离内的空间对象。MySQL使用R-Tree索引来实现空间索引。

三、MySQL索引实现原理

MySQL使用多种算法来实现不同类型的索引。在下面的部分中,我将介绍MySQL使用的常见算法。

  • B-Tree索引实现原理

B-Tree索引使用一种平衡树的数据结构,每个节点包含多个键和指向其他节点的指针。根据节点的层数,B-Tree索引可以是平衡的或不平衡的。

MySQL使用InnoDB存储引擎来实现B-Tree索引。当创建一个InnoDB表时,MySQL会自动在主键上创建一个B-Tree索引。如果定义了其他索引,MySQL将创建相应的B-Tree索引。

 

B-Tree索引的实现原理如下:

(1)节点结构

InnoDB的B-Tree索引节点包含多个数据页,每个数据页包含多个键值对。在索引节点中,键被存储为固定长度的二进制字符串,指针指向其他节点或数据页。

(2)数据页结构

InnoDB的数据页包含多个记录,每个记录包含一个键和一个指向对应数据行的引用。

(3)页分裂和页合并

当一个数据页已满时,InnoDB将执行页分裂操作。在页分裂操作中,InnoDB将数据页中一半的记录移到新的数据页中,并将新数据页的地址插入到父节点中。

当一个数据页的记录数量低于一定阈值时,InnoDB将执行页合并操作。在页合并操作中,InnoDB将两个相邻的数据页合并为一个数据页,并将父节点中相应的指针删除。

(4)索引维护

当插入、更新或删除一行时,InnoDB需要更新B-Tree索引。如果插入的行是按照主键顺序插入的,则不需要重新平衡B-Tree索引。否则,InnoDB将执行页分裂操作,以确保B-Tree索引保持平衡。

  • Hash索引实现原理

Hash索引使用哈希表来存储数据。当插入一行时,MySQL使用哈希函数计算键的哈希值,并将数据插入到相应的哈希桶中。当查询时,MySQL使用哈希函数计算查询键的哈希值,并在相应的哈希桶中查找数据。

MySQL使用Memory存储引擎来实现Hash索引。Memory存储引擎将表存储在内存中,并使用哈希表来存储数据。由于哈希表是无序的,Memory存储引擎不支持排序、分组或范围查询。

 

Hash索引的实现原理如下:

(1)哈希桶结构

Memory存储引擎的哈希桶由一个哈希链表和一个自适应哈希索引组成。哈希链表用于解决哈希冲突,自适应哈希索引用于提高哈希查找的效率。

(2)哈希函数

Memory存储引擎使用一个32位的哈希函数来计算键的哈希值。哈希函数使用加法、位移和异或等运算符来计算哈希值。

(3)哈希冲突解决

当两个键的哈希值相同时,Memory存储引擎使用链表来解决哈希冲突。每个哈希桶包含一个链表,链表中的每个节点包含一个键和对应的数据行。当插入一行时,Memory存储引擎将新行插入到链表的头部。

(4)哈希表扩容

当哈希表中的哈希桶数量不足以容纳数据时,Memory存储引擎将执行哈希表扩容操作。在哈希表扩容操作中,Memory存储引擎创建一个新的哈希表,并将旧哈希表中的数据移动到新哈希表中。哈希表扩容操作会导致数据移动,因此会影响性能。

(5)哈希索引

Memory存储引擎的哈希索引用于提高哈希查找的效率。哈希索引由一个哈希表和一个索引表组成。哈希表用于存储数据,索引表用于记录每个哈希桶的起始位置和长度。当查询一行时,Memory存储引擎首先使用哈希函数计算查询键的哈希值,并在索引表中查找对应的哈希桶。然后,Memory存储引擎在哈希表中查找数据。

  • Full-Text索引实现原理

Full-Text索引使用倒排索引(Inverted Index)来实现全文搜索。倒排索引是一种将文档中的每个单词映射到包含该单词的文档的技术。

MySQL使用MyISAM存储引擎来实现Full-Text索引。MyISAM存储引擎使用倒排索引来存储Full-Text索引。Full-Text索引可以用于在文本列上执行全文搜索。

 

Full-Text索引的实现原理如下:

(1)分词器

Full-Text索引使用一个分词器来将文本分成单词。MySQL使用一个基于单词的分词器,它将文本分成单词,然后将单词存储在倒排索引中。

(2)倒排索引

Full-Text索引使用倒排索引来实现全文搜索。倒排索引是一种将文档中的每个单词映射到包含该单词的文档的技术。在Full-Text索引中,倒排索引将单词映射到包含该单词的文档列表。

倒排索引使用一个多级索引结构来提高搜索效率。多级索引结构包括主索引和辅助索引。主索引包含所有单词及其对应的文档列表。辅助索引包含每个单词的位置和长度信息。

(3)全文搜索

Full-Text索引使用全文搜索来匹配查询条件。全文搜索支持布尔运算符、通配符、模糊搜索和相似度搜索等功能。全文搜索使用倒排索引来查找匹配的文档列表。

全文搜索的实现原理如下:

  • 分词:将查询条件分成单词。
  • 过滤:过滤掉停用词和短词。
  • 计算权重:计算每个单词的权重。
  • 布尔运算:根据查询条件执行布尔运算。
  • 匹配文档:匹配包含所有查询单词的文档。
  • 排序:按照权重排序。
  • 返回结果:返回匹配的文档列表。
  • B-Tree索引实现原理

B-Tree索引是MySQL中最常用的索引类型之一。B-Tree索引使用B-Tree数据结构来实现索引。B-Tree索引支持等值查询、范围查询和排序操作。

B-Tree索引的实现原理如下:

(1)B-Tree数据结构

B-Tree是一种平衡树数据结构,它可以保证每个节点的高度相同,从而保证查询效率。B-Tree中的每个节点包含一个键和对应的数据行或子节点。B-Tree中的每个节点都有相同的大小。

B-Tree中的每个节点包含多个子节点和键。子节点指向下一级节点,键用于划分节点的范围。B-Tree中的每个节点包含两个关键参数:度数和填充因子。度数指节点最多可以包含的子节点数,填充因子指节点至少要填满的子节点数。

(2)B-Tree索引结构

B-Tree索引使用B-Tree数据结构来实现索引。B-Tree索引中的每个节点包含一个键和对应的数据行或子节点。B-Tree索引中的每个节点都有相同的大小。

B-Tree索引中的每个节点包含多个子节点和键。子节点指向下一级节点,键用于划分节点的范围。B-Tree索引中的每个节点包含两个关键参数:度数和填充因子。度数指节点最多可以包含的子节点数,填充因子指节点至少要填满的子节点数。

B-Tree索引使用分裂和合并操作来维护索引的平衡性。分裂操作在节点达到度数上限时触发,它将节点分成两个节点,并将中间键上移到父节点。合并操作在节点子节点数小于填充因子时触发,它将节点与兄弟节点合并,并将中间键下移到新节点。

(3)B-Tree索引查询

B-Tree索引支持等值查询、范围查询和排序操作。B-Tree索引使用二分查找算法来查找符合查询条件的节点,然后在节点中顺序查找符合查询条件的数据行。

B-Tree索引查询的过程如下:

  • 从根节点开始,比较查询条件与节点中的键。
  • 如果查询条件等于节点中的键,则在节点中查找符合查询条件的数据行。
  • 如果查询条件小于节点中的键,则进入左子节点。
  • 如果查询条件大于节点中的键,则进入右子节点。
  • 重复以上步骤,直到找到符合查询条件的节点。
  • Hash索引实现原理

Hash索引是一种基于哈希表的索引类型,它使用哈希函数将数据行映射到哈希表中的位置。Hash索引支持等值查询,但不支持范围查询和排序操作。

Hash索引的实现原理如下:

(1)哈希表

哈希表是一种基于哈希函数的数据结构,它将数据映射到固定的位置。哈希表包含两个关键参数:哈希函数和桶。哈希函数用于将数据映射到桶中,桶用于存储数据。

哈希函数的设计很重要,它应该尽可能地将数据均匀地分布到桶中。如果哈希函数设计不好,会导致桶的大小不均匀,从而影响查询效率。

(2)Hash索引结构

Hash索引使用哈希表来实现索引。Hash索引中的每个桶包含一个键和对应的数据行。Hash索引中的每个桶都有相同的大小。

Hash索引使用哈希函数将数据行映射到桶中。如果多个数据行映射到同一个桶中,它们会被存储在一个链表中。Hash索引不支持范围查询和排序操作,因为它没有对数据行进行排序。

(3)Hash索引查询

Hash索引只支持等值查询,它使用哈希函数将查询条件映射到桶中,并在链表中查找符合查询条件的数据行。

Hash索引查询的过程如下:

  • 将查询条件应用于哈希函数,得到查询条件对应的桶号。
  • 在桶中查找符合查询条件的数据行。
  • 如果多个数据行映射到同一个桶中,则在链合并操作来维护索引的平衡性。分裂操作在节点达到度数上限时触发,它将节点分成两个节点,并将中间键上移到父节点。合并操作在节点子节点数小于填充因子时触发,它将节点与兄弟节点合并,并将中间键下移到新节点。

相关文章:

MySQL索引类型及原理?一文读懂

一、什么是MySQL索引? MySQL索引是一种数据结构,用于提高数据库查询的性能。它类似于一本书的目录,通过在表中存储指向数据行的引用,使得查询数据的速度更快。 在MySQL中,索引通常是在表上定义的,它们可以…...

【C语言】字符分类函数+内存函数

目录 1.字符函数 1.1字符分类函数 1.2.字符转换函数 //统一字符串中的大小写 2.内存处理函数 2.1内存拷贝函数memcpy //模拟实现memcpy 2.2内存移动函数memmove //模拟实现memmove 2.3内存比较函数memcmp 2.4内存设置函数memset 1.字符函数 1.1字符分类函数 头文…...

高通平台开发系列讲解(SIM卡篇)SIM卡基础概念

文章目录 一、SIM卡基本定义二、卡的类型三、SIM卡的作用三、SIM卡基本硬件结构四、SIM卡的内部物理单元五、卡文件系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍SIM的相关组件。 一、SIM卡基本定义 SIM卡是一种智能卡(ICC Card/UICC Card) SIM…...

记录一次ubuntu下配置ssh登录出现的问题

现象描述: 1. 配置完服务器端公钥和本地的私钥之后,ssh登录始终会让输入密码,用ssh -vvv rootip 查看发现发送密钥之后就没反应了。 本机debug info: debug1: Trying private key: C:\Users\wangc/.ssh/id_xxxx (私钥文件) debug3…...

深度剖析数据在内存中的存储(下)(适合初学者)

上篇讲解了整形在内存中的存储方式,这篇文章就来继续讲解浮点数在内存中的存储方式。 上篇地址: (5条消息) 深度剖析数据在内存中的存储(上)_陈大大陈的博客-CSDN博客 目录: 3.浮点型在内存中的存储 3.1.浮点数的…...

智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台

项目简介: 一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台,通过平台将所有设备连接起来,为上层应用提供设备的管理、数据收集、远程控制等核心物联网功能。 支持支持远程对设备进行实时监控、故障排查、远程控制&#…...

2023年,拥有软考证书在这些地区可以领取福利补贴

众所周知,软考的含金量很高,比如可以入户、领取技能补贴、抵扣个税、以考代评、招投标加分,入专家库… 今天小编给大家收集了拥有软考证书可以领取软考福利的地区,希望对大家有所帮助! 【深圳】 入户 ①核准类入户:…...

使用Unity在材质球上实现绘画:详细解释每一行Shader代码!

在Unity中实现在材质球上绘画可以使用下面这个步骤:创建一个基础的材质球:在Unity的项目面板中创建一个新材质球,然后将其分配给您要绘画的对象。创建一个Shader:为了实现在材质球上绘画,您需要使用一种特殊的Shader。…...

Tesseract 4.0训练字库并且识别训练后的图片

各个工具下载链接在文章底部! 重要!!自己先创建一个空文件夹(名字随意),用来保存训练后的模型 ,还需要在里面创建一个 名称为tessdata 的文件夹 ,必须叫这个名 可以先使用下载后的进行测试训练(只需要把ja…...

ChatGPT热潮背后,金融行业大模型应用路在何方?——金融行业大模型应用探索

ChatGPT近两个月以来不断引爆热点,对人工智能应用发展的热潮前所未有地高涨,ChatGPT所代表的大模型在语义理解、多轮交互、内容生成中所展现的突出能力令人惊喜。而人工智能技术在金融行业的落地应用仍然面临挑战,虽然已经让大量宝贵的人力从…...

【怎么预防sql注入,以及还有预防其他的什么网络攻击】

SQL注入是一种常见的Web攻击,通过在Web应用程序中注入恶意SQL语句来获取或修改数据库中的数据。为了防止SQL注入,开发者可以采取以下措施: 1、使用参数化查询(Prepared Statement)或存储过程(Stored Proce…...

2023年全国最新机动车签字授权人精选真题及答案4

百分百题库提供机动车签字授权人考试试题、机动车签字授权人考试预测题、机动车签字授权人考试真题、机动车签字授权人证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.使用转化炉原理测量氮氧化物的排气分析仪进行排气污…...

【Java】用记事本实现“HelloWorld”输出

【在进行以下操作前需要下载好JDK并配置好对应的环境变量】 一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.j…...

我希望早点知道的关于成长的建议

人上了年纪,往往在诸如更加闭塞,更加固执这些缺点之外,再多出来一个缺点:那就是动不动就爱给别人建议。我当然也未能免俗。有时候会听到同样悲观且固执的过来人告诉我,这些建议说了和没说效果都一样,人们在…...

【哈希表】使用方法总结

1. uthash简介开源的第三方头文件,这只是一个头文件:uthash.h。uthash还包括三个额外的头文件,主要提供链表,动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。…...

【笑小枫-面试篇】Java基础面试题整理,努力做全网最全

写在前面 或许你只是想白嫖内容,或许你也会忽略这段文字,但我还是想弱弱的说 题目整理耗费了大量精力,希望可以给博主点赞收藏,谢谢大家啦 我呢,笑小枫,一个努力的普通人,也希望可以花1秒钟记住…...

亚马逊短期疲软,但长期前景乐观

来源:猛兽财经 作者:猛兽财经 由于投资者对亚马逊(AMZN)前景的担忧,导致该公司的股价在过去一年中下跌了39%。然而猛兽财经认为亚马逊近期面临的不利因素只是暂时的,该公司还是有充分的条件可以在医疗保健和物流领域获得重大增长机…...

webgis高德地图

webgis高德地图 首先准备工作,注册一个高德地图账号,然后在创建一个新应用生一个key跟appId 高德开放平台 接着创建一个html页面 高德配置手册 <style>* {margin: 0;padding: 0;}#...

django项目实战十(django+bootstrap实现增删改查)进阶数据统计

目录 一、echarts 1、下载 2、配置 二、实现统计分析页面--架构和柱图 1、url 2、chart.py 3、chart_list.html 4、修改url 5、新增chart_bar方法 6、修改chart_list.html 四、饼图 1、url 2、视图chart.py新增 3、修改chart_list.html 五、折线图 1、url 2、char…...

【布隆过滤器(Bloom Filter)基本概念与原理、Bloom Filter优点与缺点、以及应用场景】

布隆过滤器&#xff08;Bloom Filter&#xff09;基本概念与原理、Bloom Filter优点与缺点、以及应用场景 Bloom Filter 基本概念 布隆过滤器是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在…...

unity的Rendertexture上面显示粒子特效最便捷的解决方案

一、为什么不显示 1.为什么粒子特效也不显示? 不显示是正常的,因为当前为背景的点设置为A为0时已经被剔除,当前位置粒子特效的颜色也会被剔除。 因为clip发生在融合blend之前,blend发生在所有颜色输出之后的帧缓存。 2.为什么NGUI的Unlit/Premultiplied Colored的shade…...

Docker 查询、停止、删除和重启容器

docker 列出所有容器IDdocker ps -aq[rootlocalhost conf]# docker ps -aq f81aa5f48427 06a66409d7ce 1c3d38b948ba 62233dfad35b 4b0032878886 0f6f368c4c1d 7d98a59a8012 1906ba6bfbe1 [rootlocalhost conf]#docker 查看所有运行容器docker ps -a[rootlocalhost conf]# dock…...

面试历程(3)

1、HashMap为什么要使用红黑树,不能使用平衡二叉树(AVL树) 二叉查找树具有的特性: 左子树上所有结点的值均小于或等于它的根结点的值。右子树上所有结点的值均大于或等于它的根结点的值。左、右子树也分别为二叉排序树。AVL树是严格平衡二叉树(左右两个子树的高度差的绝对…...

【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(二)

storybook回顾继续说说用法配置文件介绍回顾 上篇博客地址&#xff1a; https://blog.csdn.net/tuzi007a/article/details/129192502说了部分用法。 继续说说用法 配置文件介绍 开发环境的配置都在.storybook目录中&#xff0c;里面包含了2个文件 main.js preview.js先看m…...

(免费分享)基于ssm的BBS社区论坛系统带论文

项目描述前台部分:1.用户注册登录模块用户登录后,可以进行发帖回帖功能,在线签到功能,完善个人信息,添加好友,收藏贴子,评论帖子,点赞功能,记录功能(比如记录今天发生的事情)等等…2.排行榜模块1.帖子讨论热度排行,分两种排行方式:(1) 根据用户今日发出的帖子被回复数量进行排名…...

RebbitMQ 消息队列(简单使用)

消息队列介绍 MQ的优势 1.业务解耦&#xff1a;不同系统消费信息互不关联&#xff0c;灵活增减系统数量&#xff0c;修改某个系统其他系统也不影响 2.异步提速&#xff1a;不同系统之间可同时响应&#xff0c;提升并发量 3.削峰填谷&#xff1a;处理消息高峰期&#xff0c;均摊…...

OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

1. 学习目标 学习 OpenCV 图像的翻转函数 cv.flip&#xff1b;学习 NumPy 矩阵的反转函数 np.flip&#xff1b;自己实现矩阵反转的函数。 2. OpenCV 翻转 翻转也称镜像&#xff0c;是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转&#xff0c;垂直…...

CRM系统能帮外贸行业解决哪些问题

国内的外贸行业经历了四个发展阶段&#xff0c;从发展期到繁荣期&#xff0c;CRM客户管理系统逐步走到幕前&#xff0c;成为外贸企业必不可少的主打工具。那么外贸行业整面临哪些问题&#xff1f;该如何解决&#xff1f;下面我们就来说说适合外贸行业的CRM解决方案。 外贸行业…...

掌握lombok简化Java编码完成后端提效

Lombok安装 –>添加依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version><scope>provided</scope> </dependency>scopeprovided&#xff0c;说…...

【蓝桥集训】第七天——并查集

作者&#xff1a;指针不指南吗 专栏&#xff1a;Acwing 蓝桥集训每日一题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.亲戚2.合并集合3.连通块中点的数量有关并查集的知识学习可以移步至—— 【算法】——并查集1.亲戚 或许你并不知道&#…...