InnoDB索引模型

索引: 数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
MySQL中有三大索引:B+树索引,Hash索引,全文索引
InnoDB不支持Hash索引

索引的原理就是二分查找:
最基本的想到的数据结构就是二叉树

  • 二叉查找树: 如果插入的数字恰好是有序递增的,那么就是一颗斜树,就和数组一样了
  • 平衡二叉树: 左右子树深度差绝对值不能超过 1
    image
    平衡二叉树中,一个节点的大小是一个固定的单位
    索引中存储的位置:
  1. 索引的键值,比如我们在 id 上面创建了一个索引,我在用 where id =1 的条件查询的时候就会找到索引里面的 id 的这个键值
  2. 数据的磁盘地址,索引的作用就是去查找数据的存放的地址
  3. 左右子节点的指针
    image
    缺点:
    InnoDB 操作磁盘的最小的单位是一页(或者叫一个磁盘块),大小是 16K(16384字节),那么一个树的节点就是16K的大小。如果一个节点只存一个键值+数据+引用,占用的可能只是几十字节,但是访问树的一个节点就要发生一次IO,就是发生一次IO的访问造成了大量的浪费
  • 多路平衡查找树:

特点:分叉数(路数)永远比关键字数多 1。比如下面的这棵树,每个节点存储两个关键字,那么就会有三个指针指向三个子节点
image

如何保持的平衡?
比如 Max Degree(路数)是 3 的时候,我们插入数据 1、2、3,在插入 3 的时候,本来应该在第一个磁盘块,但是如果一个节点有三个关键字的时候,意味着有 4 个指针, 子节点会变成 4 路,所以这个时候必须进行分裂(其实就是 B+Tree)。把中间的数据 2提上去,把 1 和 3 变成 2 的子节点
如果删除节点,会有相反的合并的操作
image
在更新索引的时候会有大量索引的结构的调整,所以:
不要在频繁更新的列上建索引,不要更新主键
节点的分裂和合并,其实就是 InnoDB 页(page)的分裂和合并。

  • B+树:
    image
    MySQL 中的 B+Tree 有两个特点:
  1. 它的关键字的数量是跟路数相等的
  2. B+Tree根节点和枝节点中都不会存储数据,只有叶子结点才存储数据
    搜索到的关键字不会直接返回,会到最后一层的叶子节点拿数据
  3. B+Tree的每个叶子结点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构
    InnoDB中的B+Tree这种特点带来的优势:
  4. 扫库,扫表的能力更强,如果我们要对表进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整颗B+树拿到数据
  5. B+Tree的磁盘读写能力相对于B tree来说更强:根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多
  6. 排序能力更强:因为叶子节点上有下一个数据区的指针,数据形成了链表
  7. 效率更加稳定: B+Tree永远是在叶子节点拿到数据,所以IO次数是稳定的

作者:Zhbeii

出处:https://www.cnblogs.com/zhbeii/p/15775782.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Zhbeii  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示