二叉排序树:
1.定义: 若左子树不空,则左子树上所有节点的值均小于它的根节点的值 若右子树不空,则右字数上所有节点的值均大于它的根节点的值 它的左、右子树也分别为二叉排序数(递归定义)
|
B树:
B树事实上是一种平衡的多叉查找树,也就是说最多可以开m个叉(m>=2),我们称之为m阶b树, m阶B树满足以下条件: 1、每个节点至多可以拥有m棵子树 2、根节点,只有至少有2个节点(要么极端情况,就是一棵树就一个根节点,单细胞生物,即是根,也是叶,也是树)。 3、非根非叶的节点 至少有的Ceil(m/2)个子树(Ceil表示向上取整,图中5阶B树,每个节点至少有3个子树,也就是至少有3个叉) 4、非叶节点中的信息包括[n, A0,K1, A1,K2,A2,…,Kn,An],,其中n表示该节点中保存的关键字个数,K为关键字且Ki<Ki+1,A为指向子树根节点的指针 从根到叶子的每一条路径都有相同的长度,也就是说,叶子节在相同的层,并且这些叶子节点不带信息, 实际上这些节点就表示找不到指定的值,也就是指向这些节点的指针为空????????
B树的查询过程和二叉排序树比较类似,从根节点依次比较每个结点,因为每个节点中的关键字和左右子树都是有序的,所以只要比较节点中的关键字,或者沿着指针就能很快地找到指定的关键字, 如果查找失败,则会返回叶子节点,即空指针????? 如果在非叶子节点上的关键字等于给定值,就终止; 可能B树的叶子结点就为空,只不过上图没有画出来????
例如查询图中字母表中的K 从根节点P开始,K的位置在P之前,进入左侧指针 左子树中,依次比较C、F、J、M,发现K在J和M之间 沿着J和M之间的指针,继续访问子树,并依次进行比较,发现第一个关键字K即为指定查找的值 |
B+树:
作为B树的加强版,B+树与B树的差异在于 1、有n棵子树的节点含有n个关键字(也有认为是n-1个关键字) 2、所有的叶子节点包含了全部的关键字(定义的索引),及指向包含含这些关键字记录的指针,且叶子节点本身根据关键字自小而大顺序连接3、非叶子节点可以看成索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字 B+树的查找过程,与B树类似,只不过查找时,如果在非叶子节点上的关键字等于给定值,并不终止,而是继续沿着指针直到叶子节点位置。因此在B+树,不管查找成功与否,每次查找都是走了一条从根到叶子节点的路径 |
mysql是如何使用B树的:
说明:事实上,在MySQL数据库中,诸多存储引擎使用的是B+树,即便其名字看上去是BTREE。
|
myisam的索引机制:
注意:myisam没有自增 MyISAM引擎同样也使用B+树组织索引,如下图所示,假设我们的数据不是按照之前的顺序插入的,而是按照图中的是顺序插入表,insert into .. vlaues(4,shu),(8,yang),(9,hou)........4,8是id 可以看到MyISAM引擎下, B+树叶子节点中包含的是数据记录的地址(可以简单理解为“行号”) , 而MyISAM的辅助索引在结构上和主索引没有本质的区别,同样其叶子节点也包含了数据记录的地址,稍微不同的是辅助索引的关键字是允许重复 . myisam主索引和辅助索引的叶子结点存储的是地址,一旦发生行移动时,需要进行维护; |
比较:
1.Innodb辅助索引的叶子节点存储的不是地址,而是主键值,这样的策略减少了当出现行移动或者数据页分裂时辅助索引的维护工作,虽然使用主键值当作指针会让辅助索引占用更多空间,但好处是,Innodb在移动行时无需更新辅助索引中的主键值,而MyISAM需要调整其叶子节点中的地址 |
满意请点赞,谢谢。