b树

二叉搜索树,B树,B+树,索引

痴心易碎 提交于 2020-01-18 05:06:23
mongodb的默认存储引擎WiredTiger使用了B树索引 mysql的默认存储引擎InnoDB索引使用了B+树实现,那么各自为什么这样实现呢? 二叉搜索树 如上图是一个简单的二叉搜索树,是最为大家熟知的一种数据结构,它为什么不适合用作数据库索引? (1)当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢 (2)每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO B树 B树的特点是: (1)不再是单纯的二叉而是m叉 (2)叶子节点,非叶子节点,都存储数据 (3)中序遍历,可以获得所有节点 (4) 非根节点包含的关键字个数j满足, (┌m/2┐)-1 <= j <= m-1 ,节点分裂时要满足这个条件。 B+树 B+树,如上图,仍是m叉搜索树,在B树的基础上,做了一些改进: (1)非叶子节点不再存储数据,数据只存储在同一层的叶子节点上;B+树种 根到每一个节点的路径长度一样,而B树不是这样 (2)叶子之间,增加了链表,获取所有节点,不再需要中序遍历 这些改进让B+树比B树有更优的特性: (1)范围查找,定位min与max之后,中间叶子节点,就是结果集,不用中序回溯;范围查询在SQL中用得多,这是B+树比B树最大的优势。 (2)叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加锁,适合内存存储。 (3

从B树、B+树、B*树谈到R 树

。_饼干妹妹 提交于 2020-01-13 05:09:46
http://blog.csdn.net/v_july_v/article/details/6530142 第一节、B树、B+树、B*树(原文部分摘录) 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ),B-tree/B + -tree/ B * -tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度 O (log 2 N )与树的深度相关,那么降低树的深度自然会提高查找效率。 但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 (为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用 多叉树 结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。 也就是说,因为磁盘的操作费时费资源,如果过于频繁的多次查找势必效率低下。那么如何提高效率,即如何避免磁盘过于频繁的多次查找呢

B树、B-树、B+树、B*树

无人久伴 提交于 2020-01-12 07:44:16
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中; 否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入 右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树 的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构 (插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销; 如: 但B树在经过多次插入与删除后,有可能导致不同的结构 上边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的 树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就 是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树 结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的 策略; 2、 B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3

B树,B+树

为君一笑 提交于 2020-01-10 04:34:39
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画: B+ 树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。

B树和B+树

佐手、 提交于 2020-01-08 06:36:09
B树 一、 基本原理   B树是一种查找树,它最初启发于二叉查找树。   二叉查找树的特点是每个非叶节点都只有两个孩子节点。然而这种做法会导致当数据量非常大时,二叉查找树的深度过深,搜索算法自根节点向下搜索时,需要访问的节点也就变的相当多。   如果这些节点存储在外存储器中,每访问一个节点,相当于就是进行了一次I/O操作,随着树高度的增加,频繁的I/O操作一定会降低查询的效率。 磁盘读取信息:   找到存储这个数据所对应的磁盘页面,这个过程是机械化的过程,需要依靠磁臂的转动,找到对应磁道,所以耗时长。   读取数据进内存,并实施运算,这是电子化的过程,相当快。   对于外存储器的信息读取最大的时间消耗在于寻找磁盘页面。那么一个基本的想法就是能不能减少这种读取的次数,在一个磁盘页面上,多存储一些索引信息。   B树的基本逻辑就是这个思路,它要改二叉为多叉,每个节点存储更多的指针信息,以降低I/O操作数。 二、基本结构 1. B树的定义 这里用最小度 t 来定义B树。一棵最小度为 t 的B树是满足如下四个条件的平衡多叉树: 每个节点最多包含 2 t − 1 个关键字;除根节点外的每个节点至少有 t − 1 个关键字( t ≤ 2 ),根节点至少有一个关键字; 一个节点 u 中的关键字按非降序排列: u . k e y 1 ≤ u . k e y 2 ≤ … u . k e y n ;

MySQL索引(详细解释)

女生的网名这么多〃 提交于 2019-12-26 22:57:21
什么是索引 索引是一种 可以加快检索的数据结构 ,它 包含从表或者视图的一列或者多列生成的键 ,以及 映射到指定数据存储位置的指针 。 我们可以把数据库看成一本书,索引就是书的目录,借助目录查找信息,显然要比没有目录的书查起来要方便快捷。 索引的作用就是提高查询效率 那么索引能提高查询效率,我们就要创建很多索引么? 不是的,索引最终是存储在硬盘上的,索引越多,那么存储索引的文件就会越大,电脑在使用索引的时候,是先将索引文件加载到内存上,然后再加载到CPU上。所以,索引如果过多,会加重内存和磁盘的交互负担。 并且,数据的改动也会对索引造成影响。 总结:索引可以提高查询效率,但并不是越多越好,过多的索引会引起磁盘I/O的交互频繁,并且数据改动,索引也会受到影响。 索引分类 普通索引 :没有任何条件现制,可以给任意字段添加普通索引。 Student表中的字段有SID,Sname,Sage,Ssex, 对其中任意的一个字段都可以创建索引,没有任何现制,这就是普通索引 唯一性索引 :唯一性索引顾名思义,它可以保证索引中的所有的值都是唯一的,使得表中的每一行在某种方式上都具备唯一性。所以, 只有当唯一性是数据本身的特征的时候,指定唯一性索引才有意义。 例如:主键,在表中是不能重复的,主键索引,就是唯一性索引。 SID就是Student表的主键,SID是不会重复的字段,也就是唯一性字段

B树

余生颓废 提交于 2019-12-25 22:54:42
序言 B树是一种非常优雅的数据结构。是关系数据库和文件系统的核心算法。对于B树的了解会使得你对于数据库的学习更加系统和容易。 B树 是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。 B树 的特点也有三个。 一个节点可以容纳多个值。比如上图中,最多的一个节点容纳了4个值。 除非数据已经填满,否则不会增加新的层。也就是说,B树追求"层"越少越好。 子节点中的值,与父节点中的值,有严格的大小对应关系。一般来说,如果父节点有a个值,那么就有a+1个子节点。比如上图中,父节点有两个值(7和16),就对应三个子节点,第一个子节点都是小于7的值,最后一个子节点都是大于16的值,中间的子节点就是7和16之间的值。 这种数据结构,非常有利于减少读取硬盘的次数。假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,则需要20层! 假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。 索引 数据库以B树格式储存,只解决了按照"主键"查找数据的问题。如果想查找其他字段,就需要建立索引(index)。 所谓索引,就是以某个字段为关键字的B树文件。假定有一张"雇员表",包含了员工号(主键)和姓名两个字段。可以对姓名建立索引文件,该文件以B树格式对姓名进行储存

B树和B+树异同

淺唱寂寞╮ 提交于 2019-12-23 13:50:03
B树 B (Balanced)树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。与之前介绍的红黑树很相似,但在降低磁盘I/0操作方面要更好一些。B树与红黑树最大的不同在于,B树的结点可以有许多子女,从几个到几千个。 B+ 树 B±tree:是应文件系统所需而产生的一种B-tree的变形树,他与B树的不同点为(1)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 2、所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) B+ 树 优势 B±tree的磁盘读写代价更低 B±tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+ 树内部结点只需要1个盘快

详解B树和B+树的操作原理以及区别

心不动则不痛 提交于 2019-12-20 15:49:20
简介 主要针对B树和B+树的插入,删除操作进行解析 注 仅是自己的理解,有不对的地方还请大佬指正 1.B树 1.1.B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 1.2:一颗m阶的B树定义如下: 每个节点最多有m-1个关键字 根节点最少可以只有一个关键字 非根节点至少有Math.ceil(m/2)-1个关键字 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中所有的关键字都小于他,而右子树中所有的关键字都大于他。 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同 上图就是一颗4阶的B树。在实际应用中的B树的阶数m都非常大(通常大于100),所以即使存储大量的数据,B树的高度仍然比较小。每个结点中存储了关键字(key)和关键字对应的数据(data),以及孩子结点的指针。 我们将一个key和其对应的data称为一个记录 。 但为了方便描述,除非特别说明,后续文中就用key来代替(key, value)键值对这个整体 。在数据库中我们将B树(和B+树)作为索引结构,可以加快查询速速, 此时B树中的key就表示键,而data表示了这个键对应的条目在硬盘上的逻辑地址。 1.3:B树的插入操作 插入操作就是插入一条记录,即

B树索引

自闭症网瘾萝莉.ら 提交于 2019-12-18 03:30:55
B-Tree索引是最常见的索引结构,默认创建的索引就是B-Tree索引。 一、B树索引的结构 B-树索引是基于二叉树结构的。B-树索引结构有3个基本组成部分:根节点、分支节点和叶子节点。其中根节点位于索引结构的最顶端,而叶子节点位于索引结构的最底端,中间为分子节点。 叶子节点(Leaf node): 包含条目直接指向表里的数据行。 分支节点(Branch node): 包含的条目指向索引里其他的分支节点或者是叶子节点。 根节点(Branch node): 一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点。 可以用下图一来描述B树索引的结构。其中,B表示分支节点,而L表示叶子节点。 1.1关于分支节点块(包括根节点块) 1、 其所包含的索引条目都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。 2、 每个索引条目(也可以叫做每条记录)都具有两个字段。第一个字段表示当前该分支节点块下面所链接的索引块中所包含的最小键值;第二个字段为四个字节,表示所链接的索引块的地址,该地址指向下面一个索引块。 3、 在一个分支节点块中所能容纳的记录行数由数据块大小以及索引键值的长度决定。比如从上图一可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000 B3),它们指向三个分支节点块。其中的0