b树

查找之——B树、B+树的概念及性质+答题技巧(必背几句,考试不慌,稳得一匹)

北城余情 提交于 2019-12-05 05:03:04
2019/11/21 B树, 又称多路平衡查找树,B树中所有结点的 孩子结点数 的最大值称为B树的阶。   一颗m阶B树或是空树,或是满足如下特性的m叉树:   1)树中每个结点 至多 有m棵子树、 m-1个关键字。   2)若 根节点 不是终端节点(非叶子节点),则 至少 有两棵子树、1个关键字(由 1)得到:2阶-1=1个关键字)。   3)除根节点外的所有非叶结点(除去第一行和最后一行元素),    至少 有${\left \lceil m/2 \right \rceil}$棵子树、${\left \lceil m/2 \right \rceil}$-1个关键字。      给出 阶数m 和 关键字n→ 求 树的 最大高度 和 最小高度 ,背住以下公式,很快求出:   $\log _{m}(n+1)\leqslant \log_{\left \lceil m/2 \right \rceil}(\frac{n+1}{2})+1$    注:背住以上三条性质+最后一条公式,答题无惑矣😊🎉🎉🎉,尤其注意红色加粗部分,至少和至多的运用。 来源: https://www.cnblogs.com/LinQingYang/p/11908345.html

Mysql索引

两盒软妹~` 提交于 2019-12-05 05:01:53
前言 就我个人所知,MySQL目前已经作为绝大数项目的数据库选择。但是经常会需要去处理慢sql导致的各类问题。索引,作为一种常见的处理方式。我们有必要了解下索引的底层是怎么实现的。 思考两个问题: 1.为什么加了索引以后,数据库的查询效率会加快?底层怎么实现的? 2.索引失效的情况有哪些?失效的原因是什么? 简洁描述 索引是快速查找特定列值的行数据的,一种优化查询的数据结构。查找特定列值。例如一条sql里的查询条件是姓名 name = '张三' 。就能查出特定列(姓名列)的特定值(张三)的记录。 另外,它是一种数据结构。那么mysql的数据结构,采用的是B+树。那么,为啥选B+树而不是其他的数据结构。 从数据结构看原理 此处主要讨论下哈希表,平衡二叉树,B树,B+树这4种数据结构,以及为啥选用B+树作为mysql数据库的数据结构。首先看下这四种数据结构示例图。 哈希表 平衡二叉树 B树 B+树 哈希表 :哈希表的存储方式是通过计算出一个hash码,然后随机存放到哈希表中。注意:这时候存放的位置,生成的hash值也是无序的。 因此如果采用哈希表的话,根据某个值定向查询速度很快,也就是‘’=‘’的情况。可根据hash值直接找到对应值。但因为hash码是无序的,存储的书序也是无序的,因此hash表数据结构无法完成范围查询,比如>,<,like这些情况。显然是不满足条件的。 平衡二叉树

MySQL用B+树做索引

非 Y 不嫁゛ 提交于 2019-12-05 03:15:26
索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在mysql数据库中分三类: B+树索引、Hash索引、全文索引 我们今天要介绍的是工作开发中最常接触到innodb存储引擎中的的B+树索引。 要介绍B+树索引,就不得不提二叉查找树,平衡二叉树和B树这三种数据结构。B+树就是从他们仨演化来的。 二叉查找树 首先,让我们先看一张图  从图中可以看到,我们为user表(用户信息表)建立了一个二叉查找树的索引。图中的圆为二叉查找树的节点,节点中存储了键(key)和数据(data)。 键对应user表中的id,数据对应user表中的行数据。二叉查找树的特点就是 任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。 顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。 如果我们需要查找id=12的用户信息,利用我们创建的二叉查找树索引,查找流程如下: 1.

索引简记:B树 B+树

和自甴很熟 提交于 2019-12-04 22:03:46
数据库索引演进: 1、二叉树 如上,二叉树当时算法中的鼻祖了,O(N)的复杂度也使得他应用声名大噪,hash即使脱胎于此 那么为什么hash索引很少使用呢?一是因为极端情况下二叉树会退化为一个链表失去其二叉树的优势 2、由此,B-树, 注意是B树不是B减数,就诞生了,B树可以简单理解为平衡M岔树。如下示例为3路B树 再附一张带指针的: B树:M个节点M+1个分叉,分为数据域和指针域,既存关键字,由存指针指向孩子节点,常用于文件系统索引。 B树是解决了退化的问题了,但是如上结构,在进行范围查询的时候,B树也是疲于奔命 3、由此,B+树诞生了,B+树是基于B树的拓展,示例如下: 再附一张带指针的 如此B+树就解决了范围查询的问题,且节点(空间)利用率也高过B树。常用于DB索引! B树与B+树的区别: 在B+树中,具有n个关键字的节点只含有n棵子树,即 每个关键字对应一个子树 ;而在B树中,具有n个关键字的节点只含有n+1棵子树。 在B+树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)<=n<=m(根结点:1<=n<=m);在B树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)-1<=n<=m-1(根结点:1<=n<=m-1)。 在B+树中, 叶结点包含信息,所有非叶子结点仅起到索引作用 ,非叶结点中的每个索引项只含有对应子树的 最大关键字

索引简记:B树 B+树

孤者浪人 提交于 2019-12-04 21:38:52
数据库索引演进: 1、二叉树 如上,二叉树当时算法中的鼻祖了,O(N)的复杂度也使得他应用声名大噪,hash即使脱胎于此 那么为什么hash索引很少使用呢?一是因为极端情况下二叉树会退化为一个链表失去其二叉树的优势 2、由此,B-树, 注意是B树不是B减数,就诞生了,B树可以简单理解为平衡M岔树。如下示例为3路B树 再附一张带指针的: B树:M个节点M+1个分叉,分为数据域和指针域,既存关键字,由存指针指向孩子节点,常用于文件系统索引。 B树是解决了退化的问题了,但是如上结构,在进行范围查询的时候,B树也是疲于奔命 3、由此,B+树诞生了,B+树是基于B树的拓展,示例如下: 再附一张带指针的 如此B+树就解决了范围查询的问题,且节点(空间)利用率也高过B树。常用于DB索引! B树与B+树的区别: 在B+树中,具有n个关键字的节点只含有n棵子树,即 每个关键字对应一个子树 ;而在B树中,具有n个关键字的节点只含有n+1棵子树。 在B+树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)<=n<=m(根结点:1<=n<=m);在B树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)-1<=n<=m-1(根结点:1<=n<=m-1)。 在B+树中, 叶结点包含信息,所有非叶子结点仅起到索引作用 ,非叶结点中的每个索引项只含有对应子树的 最大关键字

HBASE-LSM树(转载)

自古美人都是妖i 提交于 2019-12-04 19:55:13
HBASE-LSM树 1.B+树 关于B树、B+树、B 树的了解参考: * http://blog.csdn.net/v_july_v/article/details/6530142 优点: 走进搜索引擎的作者梁斌老师针对B树、B+树给出了他的意见(为了真实性,特引用其原话,未作任何改动): “B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。“ 为什么说B+tree比B树更适合实际应用中操作系统的文件索引和数据库索引 ? (1) B+tree的磁盘读写代价更低 B+tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+ 树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+ 树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。 (2)B

B树 B+树理解

ε祈祈猫儿з 提交于 2019-12-04 11:34:38
B树,磁盘io用的比较多,根节点常驻内存,所以谈论高度的时候不算根节点这一层,每一个节点保存元素的数量和一个叫做度数t的值有关,范围是[t-1,2t-1],这里t>=2,也就是非空的b树最少有一个值也就是根节点中的那个。 这样树的高度和度数t以及总节点数有一个约束关系: 深度为0的最少有一个根节点,最少包含1一个元素 深度为h的至少有个2*t (h-1) ,至少包含2*t (h-1) *(t-1)个元素 等比数列运算一下,得到元素的最少个数是2t h - 1,移项,得到高度h <= log t (n+1)/2 来源: https://www.cnblogs.com/chuliang/p/11858668.html

[转帖]B树索引、位图索引和散列索引

送分小仙女□ 提交于 2019-12-04 10:10:46
B树索引、位图索引和散列索引 https://blog.csdn.net/huashanlunjian/article/details/84460436 索引在数据结构上可以分为三种B树索引、位图索引和散列索引 B树索引 结构: 特点: 1.索引不存储null值。 更准确的说,单列索引不存储null值,复合索引不存储全为null的值 索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只 能全表扫描。 为什么索引列不能存Null值呢?将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值 的特殊性就在于参与的运算大多取值为null。这样的话,null值实际上是不能参与进建索引的 过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。 B树索引测试1:NULL是否存在索引上。 create table btree_test(id number,code varchar2(10)); create index idx_btree_test_id on btree_test(id,code); select object_id from user_objects where object_name='IDX_BTREE_TEST_ID'; alter session set events 'immediate

[转帖]B树索引和位图索引的结构介绍

丶灬走出姿态 提交于 2019-12-04 10:10:46
B树索引和位图索引的结构介绍 http://blog.itpub.net/12679300/viewspace-1174236/ 一 前言:? ROWID :包含键值的行的行ID,( 查找块的最快方法,类似于门牌号 )? 因为所有行属于同一个段,所以要使用受限的ROWID 指向表行 索引是数据库为了提高查询效率提供的一种冗余结构,保守计算数据库50%以上的调优可以通过调整索引来进行优化; 引用国内一位资深的ORACLE专家的话:"我其实只懂点(挨踢)知识,IT里面其实只懂点甲骨文,甲骨文里面其实只懂点数据库,数据库里面其实只懂点SQL,SQL里面其实只懂点索引"——"你才是真正的专家!" 根据个人的浅薄的经验,作为DBA的日常运维会越来越少,从数据库的每个版本的更新来看,数据库系统已经趋向越来越智能话,DBA能干的活也越来越少了,如果一个DBA只能做做日常的表空间扩容、数据库的备份恢复、启停、系统的更新,那么将是很危险的一件事。而调优自古以来就是一门很高深的学问,如果能把这个做好了,那么DBA能够创造的价值和在公司的作用中,将越来越显著; 说了这么多,应该引入主题了,如果要做好调优,先从索引入手吧。 后续的章节中将陆续更新索引的一些知识,第一章从索引的类别开始吧; 二 索引在结构上的类别可划分如下:B树索引、位图索引、散列索引、反转索引等 三 索引的介绍: 1、B树索引(BTREE

MySQL索引底层实现

被刻印的时光 ゝ 提交于 2019-12-04 07:10:44
  索引是数据结构   每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。   上图展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在 O ( l o g n 2 ) O(log2n)的复杂度内获取到相应数据。   虽然这是一个货真价实的索引,但是实际的数据库系统几乎没有使用二叉查找树或其进化品种红黑树(red-black tree)实现的,原因会在下文介绍。 B树   B树事实上是一种平衡的多叉查找树,也就是说最多可以开m个叉(m>=2),我们称之为m阶b树 总的来说,m阶B树满足以下条件: 每个节点至多可以拥有m棵子树。 根节点,只有至少有2个节点(要么极端情况,就是一棵树就一个根节点,单细胞生物,即是根,也是叶