数据结构 —— B+树和B*树及MySQL底层引擎
我们之前学习了B树的基本原理,今天我们来看看B树的一些改良版本——B+树和B*树。如果还没有了解过的小伙伴可以点击这里:
我们首先来看看B+树:
B+树
B+树是B树的变形,是在B树基础上优化的多路平衡搜索树,B+树的规则跟B树基本类似,但是又在B树的基础上做了以下几点改进优化:
大致是长成这个样子的:
简单点来说,就是取消了最左边的树,让孩子等于关键字的个数,同时,所有的数据存放在叶子结点,非叶子结点只存放最小元素的地址,可以通过该地址寻找这个元素
下面是一些特点,可以结合上面的图参考:
这些特点使B+树成为数据库索引和其他需要高效数据检索和更新的系统中的理想选择。
B*树
B树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。
下面是B树的一些特点:
B* 树的这些特性使其在处理大量数据和频繁更新的场景下表现更好,特别是在需要优化磁盘I/O的环境中 ,如大型数据库和文件系统。然而,B*树的复杂度略高于B树,因为需要处理预分配溢出和再分配逻辑,但这通常可以通过减少磁盘写操作带来的性能提升来弥补。
总结一下三种树的特点:
B树的应用
B树在计算机科学和数据管理领域有着广泛的应用,尤其是对于需要处理大量数据和频繁读写操作的系统。以下是B树及其变体(如B+树和B*树)的几个主要应用领域:
B树之所以如此流行,是因为它能够有效处理大量数据,同时保持良好的性能和数据完整性。在需要频繁读写操作的场景下,B树的自平衡和高效查找特性使其成为一个理想的选择。
我们主要介绍一下B树在MySQL中的应用:
B树在MySQL中的应用
B树在MySQL中的应用主要体现在索引上:
在这篇文章中,我们介绍过MySQL中的索引是一种数据结构,这个数据结构。没错!就是B树。
同时基于B树,在创建索引时,会有两种方式:MyISAM和InnoDB。
我们分别来介绍一下:
MyISAM
MyISAM
是 MySQL 中的一个存储引擎,它在 MySQL 的早期版本中非常流行,尤其在那些读取密集型的应用程序中,如网站和数据仓库。MyISAM 引擎具有以下特点和功能:
MyISAM的B树的叶子结点存放的是数据的地址这是一个和InnoDB最本质的区别:
上图是以以Col1为主键,MyISAM的示意图,可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果想在Col2上建立一个辅助索引,则此索引的结构如下图所示:
InnoDB
InnoDB
是 MySQL 数据库中最常用的存储引擎之一,尤其在需要事务处理、并发控制和数据完整性保障的应用场景中。InnoDB 被设计为一个事务安全的存储引擎,提供了高级的数据库功能,以下是 InnoDB 的一些关键特性和功能:
由于这些特性,InnoDB 成为了现代数据库应用的首选存储引擎,尤其是在需要高并发、数据一致性和事务安全的场景下。自 MySQL 5.5 版本开始,InnoDB 已经成为了 MySQL 的默认存储引擎。
InnoDB的B树创建索引时,叶子结点存储的就是文件,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录,这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。
第二个区别是,第二个区别是InnoDB的辅助索引data域存储相应记录主键的值而不是地址,所有辅助索引都引用主键作为data域。
这就是会导致一个问题标准不一样,形成的B树可能会不一样,所以InnoDB创建索引一定要你指定主键,这是因为如果你之后还有其他的寻找标准,会以当前标准在对应的B树中寻找,然后又会回到主键创建的B树中寻找,会找两次。
比如说:
CREATE TABLE students (
student_id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (student_id), //会以student_id主键创建一棵B树
INDEX idx_name (name) //会以name创建一棵B树
) ENGINE=InnoDB;
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。