MySQL --索引

一、索引概述

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
 
二、索引结构

 

索引结构的选择

假如说MySQL的索引结构采用二叉树的数据结构,比较理想的结构(满二叉树或完全二叉树)如下:
 
如果主键是顺序插入的,则会形成一个单向链表,结构如下:
 
所以,如果选择二叉树作为索引结构,会存在以下缺点: 
  • 顺序插入时会形成一个链表,查询性能大大下降
  • 大量数据下,层级越深,检索速度越慢
此时大家可能会想到,我们可以选择红黑树,红黑树是一颗自平衡二叉树,那这样即使是顺序插入数
据,最终形成的数据结构也是一颗平衡的二叉树,结构如下:

 

但是,即使如此,由于红黑树也是一颗二叉树,所以也会存在一个缺点:
  • 大量数据下,层级越深,检索速度慢
所以,在MySQL的索引结构中,并没有选择二叉树或者红黑树,而选择的是B+Tree。
 
三、B-Tree,B+Tree Hash
 
B-Tree
介绍:
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针: 

 

特点:

  • m阶的B-Tree,每一个节点最多存储 m-1 个Key,对应m个指针
  • 一旦节点存储的Key达到m,就会裂变,中间元素向上裂变
  • 在B树中,非叶子节点和叶子节点都会存储数据

B+Tree

介绍:

B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一下其结构示意图:

我们可以看到,两部分:
  • 绿色框框起来的部分,是索引部分,仅仅起到索引数据的部分,不存储数据
  • 红色框框起来的部分,是数据存储部分,在其叶子节点中存储具体的数据

特点:

  • 所以数据都会存储在叶子节点
  • 叶子节点形成一个单向链表
  • 非叶子节点仅仅起到索引数据的作用,具体数据都在叶子节点存放
上述我们所看到的结构是标准的B+Tree的数据结构,接下来,我们再来看看MySQL中优化之后的B+Tree。
MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。 
Hash
 
介绍:
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中

 

 特点:

  • Hash只能用于对等比较(=,in),不支持范围查询(between,<,>等)
  • 无法利用索引完成排序操作
  • 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引
 四、索引分类
 
在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。

 

 五、聚集索引和二级索引

而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

 

 聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,就会使用第一个唯一索引作为聚集索引
  • 如果表中没有主键,也没有合适的位于索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
聚集索引和二级索引的具体结构如下:

 

  •  聚集索引的叶子节点下挂的是这一行的数据
  • 二级索引的叶子节点挂的是该字段值对应的主键

 

 
posted @   yxhhhhhh  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示