为什么InnoDB存储引擎会选择B+ Tree作为索引结构?

文章详细比较了B-Tree和B+Tree数据结构,以及它们在MySQL中的应用,特别是B+Tree如何通过增加顺序指针优化区间访问。同时介绍了哈希索引的工作原理及其特点,如快速查找但不支持范围查询和排序。
摘要由CSDN通过智能技术生成
数据结构可视化的网站: https://www.cs.usfca.edu/~gall es/visualization/BTree.html

前置知识(MAX情况下):

1.  key数量    =  度数  - 1

2.   度数 = 指针数量   

 3. 一旦,某一结点key数量等于度数,则会发生裂变,中间元素向上分裂,

     中间元素index =偶数KEY/2 

     中间元素index =(奇数KEY/2)向上取整

B-Tree

    

B+Tree

MySQL优化后的B+Tree 

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点 的链表指针,就形成了带有顺序指针的B+Tree提高区间访问的性能,利于排序。

Hash

哈希索引就是采用一定的 hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在 hash表中。

哈希表可以快速找到对应的值,是因为它利用了哈希函数和数组的特性。

1. 哈希函数:哈希函数可以将数据映射为一个固定长度的值,这个值通常称为哈希码或哈希值。通过哈希函数,我们可以将数据快速转换为一个索引,这个索引可以直接对应到数组中的一个位置。

2. 数组:哈希表通常是基于数组实现的。当我们得到了数据的哈希值后,可以直接将其作为数组的下标,将数据存储在对应的位置上。这样,在查询时,只需要通过哈希函数计算出哈希值,然后直接定位到数组中对应的位置,就可以快速找到对应的值。

3. 哈希表基于数组实现时,数组的长度通常是固定的,但也有一些实现中可以动态调整数组的长度。

在大多数情况下,哈希表会预先分配一个固定大小的数组,然后通过哈希函数将数据映射到数组的特定位置。

当数组的负载因子达到一定阈值时,有些实现会进行数组扩容操作,以减少哈希冲突的可能性,并提高性能。

在动态调整数组长度时,通常会创建一个更大的数组,然后将哈希表中的数据重新哈希到新的数组中。这样可以保持哈希表的性能,并且减少哈希冲突的发生。

4.哈希表中的数据映射到特定的位置 是 根据哈希函数计算得到的哈希值。

哈希函数接受输入数据,并将其转换为一个固定长度的哈希码或哈希值。这个哈希值通常用作数组的索引,从而将数据存储在特定的位置上。

一个好的哈希函数应该能够将不同的输入数据映射为尽可能不同的哈希值,以减少哈希冲突的可能性。

当哈希函数计算得到哈希值后,数据就会被存储在哈希值对应的数组位置上。这样,在查询时,可以通过哈希函数计算得到哈希值,然后直接定位到数组中对应的位置,从而快速找到对应的值。

因此,哈希表中数据映射到特定的位置是根据哈希函数计算得到的哈希值,这个哈希值用作数组的索引,用来存储和查找数据。

总的来说,哈希表基于数组实现时,数组的长度通常是固定的,但一些实现中也会进行动态调整数组长度的操作。

需要注意的是,虽然哈希表可以快速找到对应的值,但也存在一些问题。首先,哈希冲突可能会发生,即不同的数据经过哈希函数计算得到相同的哈希值,需要额外的处理逻辑来解决这个问题。其次,在哈希表中进行范围查询或者排序是比较困难的,因为哈希表中的数据并不是有序存储的。

特点

A. Hash 索引只能用于对等比较 (= in) ,不支持范围查询( between > < ...
B. 无法利用索引完成排序操作
C. 查询效率高,通常 ( 不存在 hash 冲突的情况 ) 只需要一次检索就可以了,效率通常要高于 B+tree

存储引擎支持

MySQL 中,支持 hash 索引的是 Memory 存储引擎。 而 InnoDB 中具有自适应 hash 功能, hash 索引是
InnoDB 存储引擎根据 B+Tree 索引在指定条件下自动构建的

为什么InnoDB存储引擎选择使用B+tree索引结构?

A. 相对于二叉树,层级更少,搜索效率高;
B. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
C. 相对Hash索引,B+tree支持范围匹配及排序操作;

B树和B+树是常见的数据结构,用于实现数据库索引和文件系统等。它们有一些相似之处,但也有一些重要的区别。

B树和B+树的区别主要体现在以下几个方面:

1. 节点结构:


   - 在B树中,每个节点既存储数据,又存储索引

    -在B+树中,数据只存储在叶子节点上,非叶子节点只存储索引。

     这意味着B+树的非叶子节点可以存储更多的索引,从而提高了索引的查找效率。

2. 叶子节点的连接:


   - 在B+树中,叶子节点通过指针连接成一个有序链表,这样可以方便范围查询。

    -在B树中,叶子节点之间没有直接的连接,需要通过非叶子节点来进行查找。

3. 查找效率:


   - B+树由于叶子节点形成有序链表,因此范围查询的效率更高。

   - B树在范围查询时需要进行递归遍历,效率相对较低。

4. 优势和劣势:


   - B树的优势在于,由于每个节点都包含数据,因此它更适合于随机读取,对于数据库系统来说,可以更快地进行随机查找。

   - B+树在范围查询和顺序访问方面更加高效,因此更适合于文件系统和数据库索引。

总的来说,B+树相对于B树来说,更适合于范围查询和顺序访问,而B树更适合于随机读取。在实际应用中,需要根据具体的场景和需求来选择合适的数据结构。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值