MySQL索引底层数据结构与算法
一:什么是索引
索引是帮助MySQL高效获取数据的排好序的数据结构;
二:索引的数据结构
二叉树;红黑树;Hash表;B-树;
二叉树的特性:
1.每个节点有一个关键字(根结点)
2.左右叶子节点至多有一个
3.根结点大于左叶子节点,小于右叶子节点
原始的二叉树在极端情况下,会退化成链表,所以导致了树的高度非常高,搜索效率变慢;
红黑树的特性:
1.每个节点或者是黑色,或者是红色。
2.根节点是黑色。
3.每个叶子节点(NIL或NULL)是黑色。
4.如果一个节点是红色的,则它的子节点必须是黑色的。
5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
6.红黑树时间复杂度是O(lgn)
分别输入1,2,3
会翻抓成如上图1所示红黑树
红黑树的搜索效率虽然高,但是树的高度会相对于B树和B+树高的多,需要的内存空间随之也会变多。
B树的特性:
1.叶子结点具有相同的深度,叶子节点的指针为空
2.所有索引元素不重复
3.节点中的数据索引从左到右递增排列
B+树的特性:
1.非叶子结点不存储data,只存储索引,可以放更多的索引
2.叶子结点包含所有索引字段
3.叶子结点用指针连接,提高区间访问的性能
叶子结点中的data是每一行记录的磁盘文件地址;
非叶子结点(冗余索引)构建这个树的时候,取得每个叶子结点的第一个元素,
Hash结构:
对索引的key进行一次hash计算就可以定位出数据存储的位置
很多时候Hash索引要比B+树索引更高效
仅能满足 "=" "IN" ,不支持范围查询
存在hash冲突的问题
三:存储引擎(innoDB/MyISAM)
MyISAM存储引擎:
MyISAM索引文件和数据文件是分离的(非聚集)
MyISAM存储包含三个文件:frm,MYD,MYI
frm:数据表结构相关的存储
MYD:MY+data:数据的存储
MYI:索引的存储
实现过程:根据索引在MYI文件里找到所在的地址,然后根据拿到的地址去MYD文件里定位到相对应行数的数据
innoDB存储引擎:
表结构文件本身是按B+树组织的一个索引结构文件
聚集索引 - 叶子结点 包含了 完整的数据记录
frm文件:数据表结构相关的存储
ibd文件:数据 + 索引 的存储
叶子结点:15 - 34 - Bob:存放的是15所在行的其他列的数据
innoDB为什么使用整形自增主键:
整形:在比较的时候比较快(比较转换的ASCii码)
占用的空间小,解决内存
自增:mysql的索引在维护到B+树中是排好序的,如果不按自增新增,节点会分裂,树可能要重新平衡。所以,插入自增的索引效率会更高。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性