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

news2025/8/2 11:00:50

一、什么是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索引查询的过程如下:

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

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

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

相关文章

本地新创建的项目,关联/上传到码云

以下示例以mac为例,window将相关步骤改为windows对应的操作即可1、打开终端,通过终端命令 cd 切换到新建的本地项目目录下,如:(/Users/wangcongming/Documents/TuoTuo/mobile_acitvity 为我的新建项目地址)…

使用 ChatGPT ,通过自然语言编写 eBPF 程序和追踪 Linux 系统

eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。今天,eBPF被广泛用于各类场景:在现代数据中心和云原…

「RISC-V Arch」SBI 规范解读

术语 SBI,Supervisor Binary Interface,管理二进制接口 U-Mode,User mode,用户模式 S-Mode,Supervisor mode,监督模式 VS-Mode,Virtualization Supervisor mode,虚拟机监督模式 …

嵌入式 Linux Shell编程

目录 1、shell脚本 2、执行shell脚本 3、shell脚本编写 3.1 shell变量 3.2 标准变量或环境变量 3.4 变量赋值有五种格式 3.5 运算符和表达式 关系运算符 布尔运算符 3.6 Test命令用法 1、判断表达式 2、判断字符串 3.判断整数 4、判断文件 3.7 数组 1、数组定义…

什么是 RPA ?What is robotic process automation (RPA)?

目录 前言 What is a business process? 什么是业务流程? What does "robotic process automation" mean?“机器人过程自动化”是什么意思? What is robotic process automation (RPA)?什么是机器人流程自动化 (RPA)? What

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一,它总是隐藏在容器的背后,默默工作,默默付出。本文为《STL 源码剖析》读书笔记,主要讨论 SGI 版本空间的配置和释放,对代码进行解读时会改变一些写法,使其更易于阅读。…

__stack_chk_fail问题分析

一、问题进程收到SIGABRT信号异常退出,异常调用栈显示__stack_chk_fail*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: Pico/A7H10/PICOA7H10:10/5.5.0/smartcm.1676912090:userdebug/dev-keys Revision: 0 ABI: arm64 Times…

VS Code下载安装教程

VS Code下载安装使用教程 目录VS Code下载安装使用教程一、下载二、安装三、使用教程3.1 VS Code中的第一个页面HelloWorld.html3.2 VS Code插件安装3.2.1 安装中文界面3.2.3 安装 Open in Browser插件3.2.4 安装Auto Rename Tag插件注意:3.3 code .命令&#xff0c…

EasyNLP集成K-Global Pointer算法,支持中文信息抽取

作者:周纪咏、汪诚愚、严俊冰、黄俊 导读 信息抽取的三大任务是命名实体识别、关系抽取、事件抽取。命名实体识别是指识别文本中具有特定意义的实体,包括人名、地名、机构名、专有名词等;关系抽取是指识别文本中实体之间的关系;…

代码随想录算法训练营第十天 | 理论基础、232.用栈实现队列、225. 用队列实现栈

打卡第10天,今天学习栈和队列 今日任务 理论基础232.用栈实现队列 用队列实现栈 理论基础 栈:先进后出 队列:先进先出 栈和队列是STL(C标准库)里面的两个数据结构 在 SGI STL 中,栈和队列的底层实现 栈…

Android使用FrameLayout+RecyclerView实现悬浮置顶封装功能

一、实际开发效果图默认效果:滚动后的效果:二、效果实现方式CoordinatorLayout AppBarLayout RecyclerView(适用于简单的悬浮View不超过一屏的情况,头部固定,数据简单)FrameLayout RecyclerView(适用于复杂的多条目布局,且悬浮条目位置受后…

移动硬盘无法识别?恢复硬盘,问题已解决

移动硬盘和U盘比较,它的体积是比较大的,但是相应的存储位置就会大点。它作为可移动设备,对于存储大型的数据,还是非常方便的。 有时候用户会发现移动硬盘出现一些问题,移动硬盘与电脑连接后,在电脑桌面右下…

java自定义注解实现数据字典映射

一 :前言 在我们开发过程中,我们从前端页面接收的数据字典一般都是key(大多数为数字),但我们在页面显示的时候,想用其value值。如果我们每使用一次就要去写一些重复的代码去查询,这样会使我们的…

SharePoint Online CDN简介

前言 可能很多人并不了解CDN这个概念,不过作为Web从业人员着实不该,CDN就是内容分发网络,说白了就是第三方帮你托管静态资源,你可以在全球任何位置快速访问到对应的节点的资源。 正文 我们提到的SharePoint CDN,其实更…

高精度加减乘除

高精度加法 对于给定的两个特别大的数我们用两个字符串来接收 s1和s2。 例如:对于两个数 56215455和95425453,即 s1 "56215455" , s2 "95425453"。 对于这两个数,分别用两个列表 a和b来接收(例如&#x…

LeetCode-78. 子集

题目来源 78. 子集 题目思路 其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。 那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而在这…

华为OD机试题,用 Java 解【比赛评分】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

开源单点登录MaxKey和JeeSite 单点登录集成指南

1. JeeSite介绍 JeeSite 隶属于济南卓源软件有限公司,是一个 Java 快速开发平台, 基于经典技术组合(Spring Boot、Shiro、MyBatis、BeetlBootstrap or TSVue3)在线代码生成工具, 支持 Spring Cloud 架构,分…

MYSQL 索引失效的十个场景(一)

一、查询条件包含or,可能导致索引失效 新建一个student表,它有一个普通索引userId,结构如下: CREATE TABLE student (id varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,name varchar(50) COLLATE utf8mb4_unicode_ci DEFAUL…

移动端适配的理解和各种方案解析(详解)

前言:最近在弄移动端项目,记录一下移动端的应用方案。对各个方案的解决理解。 目录 1.什么是移动端适配 2.理解视口viewport 2.1PC端的视口 2.2移动端的视口 2.2.0 PC端的网页在移动端显示的问题 2.2.1 布局视口 2.2.2 视觉视口 (visual viewport) …