IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> MySQL索引底层数据结构与算法 -> 正文阅读

[数据结构与算法]MySQL索引底层数据结构与算法

什么是索引?

索引,其实就是帮助MySQL高效获取数据的排好序的数据结构。索引最形象的比喻就是图书的目录。注意只有在大量数据中查询时索引才显得有意义。

在MySQL中,存在多种不同的索引,常见的索引分类如下:

按数据结构分类:B+tree索引、Hash索引、Full-text索引。
按物理存储分类:聚集索引、非聚集索引(也叫二级索引、辅助索引)。
按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。
按字段个数分类:单列索引、联合索引(也叫复合索引、组合索引)。

MySQL 的索引类型,在不同存储引擎和存储场景中,使用的索引结构和类型是不一样的,如图:
在这里插入图片描述

索引介绍和联系

接下来将按照 B树、B+树、Hash结构、聚集索引、非聚集索引和联合索引的顺序,介绍每一种类型索引的区别和联系。

1.B树结构

B树跟传统二叉树的区别:

  • B树一个节点可以存储多个元素,从左到右按从小到大排列
  • B树每个元素都包含索引列和实际数据,找到索引列,可以直接访问到该元素实际的数据
  • B树的叶子节点的指针全部都为空
  • B树所有的索引元素不会重复

在这里插入图片描述

2.B+树结构

MySQL的索引,当使用的索引方法是 BTREE 时,使用的索引结构就是B+树,而非B树。
在这里插入图片描述
相比于B树,B+树有以下特点:

  • B+树每个非叶子节点索引元素只记录索引列,不记录实际数据(索引会冗余)
  • B+树叶子节点之间,组成双向链表,链表从左到右按照从小到大排列,可以进行范围查询和访问
  • B+树的冗余索引+双向链表特性,导致B+树叶子节点包含所有索引字段
    在这里插入图片描述

3.Hash结构

Hash结构的特点:

  • 只需对索引进行一次哈希,就能找到数据对应的位置
  • 很多时候 Hash 索引比 B+ 树索引高效
  • Hash 索引只能处理 =,IN 查询,不支持范围查询
  • 存在 Hash 冲突问题

在这里插入图片描述

4.聚集索引

聚集索引使用的是B+树结构,存储数据的特点,是叶子节点会存储所有该索引列对应的所有数据,也就是MySQL表中一行所有的字段值。

这就代表着,索引列和该列对应的所有数据,在物理磁盘上,存放在相同一块地方,找到索引列就能找到该数据行所有字段信息。

InnoDB 的数据表如果有主键,MySQL 会自动构建一个主键索引结构,用于通过主键快速查找。
在这里插入图片描述

5.非聚集索引

非聚集索引和聚集索引的区别,就是非聚集索引的叶子节点存放的不是所有数据,而是指向数据行的指针,找到索引后,还需要根据该指针,访问真实存放数据的地址。

这一特点,就代表着非聚集索引需要回表查询,势必会对MySQL的查询性能造成一定的影响,没有聚集索引的效率高。

InnoDB 的非主键索引和 MyISAM 的索引,都是非聚集索引,然而这两种非聚集索引还些不同的。

①.InnoDB 非聚集索引

如下图所示,InnoDB 的非聚集索引,如普通索引,叶子节点的数据存放的是索引列+主键值,普通索引查找到主键值之后,还需要去聚集索引查询该主键值对应的所有数据(传说中的回表查询)。
在这里插入图片描述

②.MyISAM

MyISAM 的索引都是非聚集索引,原因是 MyISAM 的索引存放文件和表真实数据存放文件,是两个文件,也就是说,索引和数据放在不同文件中。

这就造成 MyISAM 每次通过索引查找到数据地址之后,必须通过访问该地址获取到真实数据。
在这里插入图片描述

6.联合索引

以联合索引 (a,b,c)为例,索引的每个节点,都分别包含 a,b,c 三列对应的值,且从上到下依次排列,根据最左匹配原则,匹配优先级从左到右依次是 a、b、c,匹配到叶子节点时,获取到该索引所在数据行的主键 id,然后再根据主键 id,到聚集索引中查询对应的实际数据(回表查询)。
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:44:27  更:2022-05-05 11:44:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:18:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码