五分钟速览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次。


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

相关推荐
Rust研习社15 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒15 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro16 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax16 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH16 小时前
Koa和Express的区别
后端
MariaH16 小时前
Koa框架的使用
后端
luckdewei18 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某19 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy19 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom19 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github