MySQL索引数据结构详解(B+树究竟长什么样)

1、什么是索引

本质上索引就是一种数据结构,通过在这些数据结构上实现快速的查找算法,我们可以快速查找到所需数据。可以是链表,HASH表,二叉树,红黑树等,但B+树最适合用来做索引,因为使用B+树读取磁盘的次数最很少(红黑树高度更高)。

2、B树的数据结构

B树又称多路平衡查找树,B树中所有节点的孩子节点数的最大值成为B树的阶,用m表示,一棵m阶B树或为空树,或为满足如下特性的m叉树:

  1. 树中每个节点至多有m棵子树(即最多有m-1个关键字)
  2. 若根节点不是终端节点,则至少有两颗子树
  3. 除根节点的所有非叶节点,至少有m/2(向上取整)棵子树(即至少有m/2 -1 个关键字)
  4. 所有非页节点结构如图1,其中Ki(i=1,2,3…,n)为节点的关键字,且满足K1 < K2 < K3 … < Kn,Pi(i=0,1,2…,n)为指向子树根节点的指针,且指针Pi-1所指子树中所有节点的关键字均小于Ki,Pi所指子树中所有节点的关键字均大于Ki,n(m/2 - 1 <= n <= m-1)为节点的关键字个数
  5. 所有叶节点的出现在同一层次上,并且不带信息(可以视为外部节点或类似于折半查找判定树的查找失败节点,实际上这些节点不存在,指向这些节点的指针为空)

图1. B树节点
图1. B树节点

B树是所有节点的平衡因子均等于0的多路查找树。如图2所示为一棵3阶B树,底层为叶节点,没有存储任何信息。

图2. 3阶B树
图2. 3阶B树

B树的高度就是查找时磁盘的存取次数。
B树的查找包含两个基本操作:1、在B树中找节点;2、在节点内找关键字。由于B树常存储在磁盘上,因此第一个操作是在磁盘上进行的,而后一个操作是在内存中进行的,即在找到目标节点后,先将节点中的信息读入内存,然后采用顺序查找法或折半查找法查找等于K的关键字。
插入关键字时,当插入后的节点关键字个数大于m-1时,必须对节点分裂。
同理,删除关键字时,设计节点的合并问题。

3、B+树的数据结构

一棵m阶的B+树满足下列条件:

  1. 每个分支最多有m棵子树(子节点)
  2. 非页根节点至少有两棵子树,其它每个分支节点至少有m/2(向上取整)棵子树
  3. 节点的子树个数与关键字个数相等
  4. 所有叶节点好包含全部关键字及指向相应记录的指针,叶节点中将关键字按大小排序,并且相邻叶节点按大小顺序相互链接起来。
  5. 所有分支节点(可视为索引的索引)中仅包含它的各个子节点(即下一级的索引块)中关键字的最大值及指向其子节点的指针。
    B+树的查找、插入、删除和B树类似。只是在查找过程中,非叶节点上的关键字值等于给定值时并不终止,而是继续向下查找,直到查到叶节点上的关键字为止,所以,B+树的查找,无论成功与否,每次查找都是一条从根节点到叶节点的路径。

如图3所示为一棵4阶B+树,从图中可以看出,分支节点的某个关键字是其子树中最大关键字的副本,通常在B+树中有两个头指针:一个指向根节点,一个指向关键字最小的叶节点,因此,可以对B+树进行两种查找运算:一种是从最小关键字开始的顺序查找,另一种是从根节点开始的多路查找。

 图3. 4阶B+树
图3. 4阶B+树

4、MyISAM引擎,非聚集索引

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。主键索引和其他索引一样,查到记录地址后还要去磁盘取数,只是主键索引要求key唯一非空。

5、 InnoDB引擎,聚集索引

而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。叶节点包含了完整的数据记录。 这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
InnoDB的辅助索引叶节点记录主键的值而不是地址,从辅助索引中查到所需主键值后再去主键索引中查询记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B树是一种常用的索引数据结构,是从二叉查找树、平衡二叉树演化而来的。它被广泛应用于数据库系统中,包括MySQL中的InnoDB存储引擎。B树的特点是具有多个子节点,可以在每个节点中存储多个键值对,而不仅仅是一个键和一个值。通过使用B树索引,数据库可以更高效地存储和查找数据。 B树索引在InnoDB中的实现方式是,将每个节点作为一个数据页。从数据页的角度来看,B树查询过程是按照一定的规则进行的。查询过程从根节点开始,根据键的值进行比较,决定向左子节点还是向右子节点继续搜索。在每个节点中,根据节点存储的键值对进行比较,直到找到匹配的键值对或者确定无法找到匹配的键值对为止。 B树的优点在于可以提供较快的查询性能,因为B树具有平衡性,所以它的高度相对较低,每次查询只需经过几个节点即可找到目标数据。此外,B树还支持高效的插入和删除操作,因为它的平衡性可以保持树的结构相对稳定。 总之,B树是一种常用的索引数据结构,通过使用多个子节点和在节点中存储多个键值对的方式,可以提供高效的数据存储和查询性能。它在数据库系统中得到广泛应用,包括MySQL的InnoDB存储引擎。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MySQL索引-B+树(讲得通透)](https://blog.csdn.net/zsz0147/article/details/117985568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [MYSQL索引数据结构----B+树](https://blog.csdn.net/sanylove/article/details/127245540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值