InnoDB索引模型
索引: 数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
MySQL中有三大索引:B+树索引,Hash索引,全文索引
InnoDB不支持Hash索引
索引的原理就是二分查找:
最基本的想到的数据结构就是二叉树
- 索引的键值,比如我们在 id 上面创建了一个索引,我在用 where id =1 的条件查询的时候就会找到索引里面的 id 的这个键值
- 数据的磁盘地址,索引的作用就是去查找数据的存放的地址
- 左右子节点的指针
缺点:
InnoDB 操作磁盘的最小的单位是一页(或者叫一个磁盘块),大小是 16K(16384字节),那么一个树的节点就是16K的大小。如果一个节点只存一个键值+数据+引用,占用的可能只是几十字节,但是访问树的一个节点就要发生一次IO,就是发生一次IO的访问造成了大量的浪费
- 多路平衡查找树:
如何保持的平衡?
比如 Max Degree(路数)是 3 的时候,我们插入数据 1、2、3,在插入 3 的时候,本来应该在第一个磁盘块,但是如果一个节点有三个关键字的时候,意味着有 4 个指针, 子节点会变成 4 路,所以这个时候必须进行分裂(其实就是 B+Tree)。把中间的数据 2提上去,把 1 和 3 变成 2 的子节点
如果删除节点,会有相反的合并的操作
在更新索引的时候会有大量索引的结构的调整,所以:
不要在频繁更新的列上建索引,不要更新主键
节点的分裂和合并,其实就是 InnoDB 页(page)的分裂和合并。
- 它的关键字的数量是跟路数相等的
- B+Tree根节点和枝节点中都不会存储数据,只有叶子结点才存储数据
搜索到的关键字不会直接返回,会到最后一层的叶子节点拿数据 - B+Tree的每个叶子结点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构
InnoDB中的B+Tree这种特点带来的优势: - 扫库,扫表的能力更强,如果我们要对表进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整颗B+树拿到数据
- B+Tree的磁盘读写能力相对于B tree来说更强:根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多
- 排序能力更强:因为叶子节点上有下一个数据区的指针,数据形成了链表
- 效率更加稳定: B+Tree永远是在叶子节点拿到数据,所以IO次数是稳定的
作者:Zhbeii
出处:https://www.cnblogs.com/zhbeii/p/15775782.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?