五分钟速览MySQL的索引结构


前言

和一个同事讨论MySQL 数据量达到多少会出现查询速度显著下降,两个半吊子 好像知道一点但是又不太说得清楚,所以本文针对MySQL的索引结构这个经典八股,做一下整理。

正文

一. 哈希索引

哈希索引 底层使用的数据结构为哈希表,在MySQL 中只有Memory引擎支持哈希索引。哈希索引可以用下图进行示意。

在发生哈希冲突时,是基于拉链法 解决冲突。哈希索引最大的缺点就是不支持范围查询

二. B树和B+树

InnoDB 引擎使用的索引的底层数据结构为B+树 ,在分析B+树 前,先对B树 进行分析。B树Balanced Tree ),全称为多路平衡查找树 ,一棵B树可以表示如下。

B树的特点可以概括如下。

  1. 所有数据分布在整个B树中;
  2. 任何一条数据会出现仅会出现在一个节点上;
  3. 搜索可能在非叶子节点上就结束。

现在开始分析B+树 ,一棵B+树可以表示如下。

B+树 相较于B树,其优势如下。

  1. B+树的扫表能力更强。做全表扫描时,只需要在叶子节点顺序的访问,不需要遍历树;
  2. 磁盘IO 能力更强。深度可以比B树更低;
  3. 排序能力更强。基于叶子节点上的双向指针实现;
  4. 效率更稳定。IO次数是稳定的。

三. MyISAM索引实现

MyISAM 使用B+树作为索引结构,并且叶子节点存储的是数据的地址。

MyISAM主键索引结构如下所示。

MyISAM主键索引辅助索引 在结构上没有区别,只不过主键索引 要求索引值唯一 ,而辅助索引不要求索引值唯一 。假如在字段2上建立一个辅助索引,则图示如下。

四. InnoDB索引实现

InnoDB 使用B+树 作为索引结构,但是具体实现与MyISAM截然不同。

InnoDB 的数据文件就是主键索引文件(MyISAM 的数据文件和索引文件是分开的,索引文件中只存储数据的地址 )。在InnoDB 中,表的数据文件本身就是按照B+树组织的一个主键索引结构,树的叶子节点保存着完整的数据。

InnoDB中的主键索引示意图如下。

因为InnoDB 的数据文件要按照主键聚族 ,所以InnoDB 引擎要求表必须有主键MyISAM 引擎的表可以没有主键)。

InnoDB中的辅助索引示意图如下。

InnoDB的辅助索引中的叶子节点存储的是对应数据的主键,使用辅助索引时,首先通过辅助索引获得数据的主键,然后再通过主键索引获得数据。

五. B+树存储数据的计算

B+树 中,每个节点对应一页(page ),一页大小为16KB 。假如非叶子节点上一个键值指针 的大小为16 字节,叶子节点上一条数据大小为1.6KB ,那么一个深度为2B+树存储的数据量可以由下图进行说明。

那么如果存储的数据量在1千万 以内,则每次查询数据时的IO 次数会稳定为3次。


总结不易,如果本文对你有帮助,烦请点赞,收藏加关注,谢谢帅气漂亮的你。

相关推荐
打工的小王2 分钟前
Langchain4j(二)RAG知识库
java·后端·ai·语言模型
Python_Study20259 分钟前
机械制造业数据采集的终极指南:从设备层到MESERP的系统性实践
数据库
李慕婉学姐12 分钟前
【开题答辩过程】以《基于springcloud的空气质量监控管理系统》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
后端·spring·spring cloud
unicrom_深圳市由你创科技16 分钟前
MySQL 乐观锁的实际落地:避免并发更新冲突的 3 种实现方式
数据库·mysql
無法複制17 分钟前
Centos7安装MySQL8.0
linux·mysql
zhujian8263721 分钟前
二十八、【鸿蒙 NEXT】orm框架
数据库·华为·sqlite·harmonyos·orm框架
Dxy123931021622 分钟前
PostgreSQL与MySQL有哪些区别:从架构到应用场景的深度解析
mysql·postgresql·架构
小码吃趴菜26 分钟前
MySQL远程连接
数据库·mysql
被星1砸昏头27 分钟前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
王文搏29 分钟前
MySQL 常用函数用法速查(含解释与示例)
数据库·mysql·adb