前置知识(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
哈希表可以快速找到对应的值,是因为它利用了哈希函数和数组的特性。
1. 哈希函数:哈希函数可以将数据映射为一个固定长度的值,这个值通常称为哈希码或哈希值。通过哈希函数,我们可以将数据快速转换为一个索引,这个索引可以直接对应到数组中的一个位置。
2. 数组:哈希表通常是基于数组实现的。当我们得到了数据的哈希值后,可以直接将其作为数组的下标,将数据存储在对应的位置上。这样,在查询时,只需要通过哈希函数计算出哈希值,然后直接定位到数组中对应的位置,就可以快速找到对应的值。
3. 哈希表基于数组实现时,数组的长度通常是固定的,但也有一些实现中可以动态调整数组的长度。
在大多数情况下,哈希表会预先分配一个固定大小的数组,然后通过哈希函数将数据映射到数组的特定位置。
当数组的负载因子达到一定阈值时,有些实现会进行数组扩容操作,以减少哈希冲突的可能性,并提高性能。
在动态调整数组长度时,通常会创建一个更大的数组,然后将哈希表中的数据重新哈希到新的数组中。这样可以保持哈希表的性能,并且减少哈希冲突的发生。
4.哈希表中的数据映射到特定的位置 是 根据哈希函数计算得到的哈希值。
哈希函数接受输入数据,并将其转换为一个固定长度的哈希码或哈希值。这个哈希值通常用作数组的索引,从而将数据存储在特定的位置上。
一个好的哈希函数应该能够将不同的输入数据映射为尽可能不同的哈希值,以减少哈希冲突的可能性。
当哈希函数计算得到哈希值后,数据就会被存储在哈希值对应的数组位置上。这样,在查询时,可以通过哈希函数计算得到哈希值,然后直接定位到数组中对应的位置,从而快速找到对应的值。
因此,哈希表中数据映射到特定的位置是根据哈希函数计算得到的哈希值,这个哈希值用作数组的索引,用来存储和查找数据。
总的来说,哈希表基于数组实现时,数组的长度通常是固定的,但一些实现中也会进行动态调整数组长度的操作。
需要注意的是,虽然哈希表可以快速找到对应的值,但也存在一些问题。首先,哈希冲突可能会发生,即不同的数据经过哈希函数计算得到相同的哈希值,需要额外的处理逻辑来解决这个问题。其次,在哈希表中进行范围查询或者排序是比较困难的,因为哈希表中的数据并不是有序存储的。
特点
存储引擎支持
为什么InnoDB存储引擎选择使用B+tree索引结构?
B树和B+树是常见的数据结构,用于实现数据库索引和文件系统等。它们有一些相似之处,但也有一些重要的区别。
B树和B+树的区别主要体现在以下几个方面:
1. 节点结构:
- 在B树中,每个节点既存储数据,又存储索引
-在B+树中,数据只存储在叶子节点上,非叶子节点只存储索引。
这意味着B+树的非叶子节点可以存储更多的索引,从而提高了索引的查找效率。
2. 叶子节点的连接:
- 在B+树中,叶子节点通过指针连接成一个有序链表,这样可以方便范围查询。
-在B树中,叶子节点之间没有直接的连接,需要通过非叶子节点来进行查找。
3. 查找效率:
- B+树由于叶子节点形成有序链表,因此范围查询的效率更高。
- B树在范围查询时需要进行递归遍历,效率相对较低。
4. 优势和劣势:
- B树的优势在于,由于每个节点都包含数据,因此它更适合于随机读取,对于数据库系统来说,可以更快地进行随机查找。
- B+树在范围查询和顺序访问方面更加高效,因此更适合于文件系统和数据库索引。
总的来说,B+树相对于B树来说,更适合于范围查询和顺序访问,而B树更适合于随机读取。在实际应用中,需要根据具体的场景和需求来选择合适的数据结构。