面试总结(数据库索引、B树、B+树)

原创 2016年08月21日 22:05:11

1.  数据库系统维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引的实现通常使用B树及其变种B+树。

 

       创建索引可以大大提高系统的性能。

       第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

       第二、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

       第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

       第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

       第五、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

 

      也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因为,增加索引也有许多不利的方面。

      第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

      第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

      第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

 

2、B树及B+树

1)B树

        B树中每个节点包含了键值和键值对于的数据对象存放地址指针,所以成功搜索一个对象可以不用到达树的叶节点。

        成功搜索包括节点内搜索和沿某一路径的搜索,成功搜索时间取决于关键码所在的层次以及节点内关键码的数量。

        在B树中查找给定关键字的方法是:首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi所指的下一层索引节点块继续查找,直到找到,或指针Pi为空时查找失败。

2)B+树

        B+树非叶节点中存放的关键码并不指示数据对象的地址指针,非叶节点只是索引部分。所有的叶节点在同一层上,包含了全部关键码和相应数据对象的存放地址指针,且叶节点按关键码从小到大顺序链接。如果实际数据对象按加入的顺序存储而不是按关键码次数存储的话,叶节点的索引必须是稠密索引,若实际数据存储按关键码次序存放的话,叶节点索引时稀疏索引。

       B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。所以 B+树有两种搜索方法:

       一种是按叶节点自己拉起的链表顺序搜索。

       一种是从根节点开始搜索,和B树类似,不过如果非叶节点的关键码等于给定值,搜索并不停止,而是继续沿右指针,一直查到叶节点上的关键码。所以无论搜索是否成功,都将走完树的所有层。

       B+ 树中,数据对象的插入和删除仅在叶节点上进行。

       这两种处理索引的数据结构的不同之处:

        a、B树中同一键值不会出现多次,并且它有可能出现在叶结点,也有可能出现在非叶结点中。而B+树的键一定会出现在叶结点中,并且有可能在非叶结点中也有可能重复出现,以维持B+树的平衡。
        b、因为B树键位置不定,且在整个树结构中只出现一次,虽然可以节省存储空间,但使得在插入、删除操作复杂度明显增加。B+树相比来说是一种较好的折中。
        c、B树的查询效率与键在树中的位置有关,最大时间复杂度与B+树相同(在叶结点的时候),最小时间复杂度为1(在根结点的时候)。而B+树的时候复杂度对某建成的树是固定的。

 

补充:

B树:

       a)    树中每个结点最多含有m个孩子(m>=2);

       b)   除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);

       c)    若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);

      d)   所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息

      e)    每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
             a)   Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。 
             b)   Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。 
             c)   关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。

B+-tree

B+树是应文件系统所需而产生的一种B-tree的变形树。

       一棵m阶的B+树和m阶的B树的异同点在于:

      a.有n棵子树的结点中含有n-1 个关键字; (此处颇有争议,B+树到底是与B 树n棵子树有n-1个关键字 保持一致,还是不一致:B树n棵子树的结点中含有n个关键字,待后续查证。

      b.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)

     c.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)

 

B*树:

B*-tree是B+-tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针),B*树中非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。

 

3.索引主要进行提高数据的查询速度。 当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡。

      创建索引:
   单一索引:Create Index <Index-Name> On<Table_Name>(Column_Name);

   复合索引: Create Index i_deptno_job onemp(deptno,job); —>在emp表的deptno、job列建立索引。

      DBA经常用 REBUILD 来重建索引可以减少硬盘碎片和提高应用系统的性能。

      ALTER INDEX emp_ix REBUILD REVERSE;   //修改索引

      drop index pk_dept;     //删除索引

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

为什么数据库使用B树索引而非散列索引

数据库
  • ingwfj
  • ingwfj
  • 2016年08月13日 00:53
  • 2817

数据库索引的实现原理

强烈建议参阅链接:http://www.linezing.com/blog/?p=798#nav-1 说白了,索引问题就是一个查找问题。。。 数据库索引,是数据库管理系统中一个排序...

面试经典问题---数据库索引B+、B-树

大型数据库数据都是存在硬盘中的,为了操作的速度,需要设计针对外存的数据结构。而数据库索引技术就是在面试中反复被问到的一个问题:数据库索引是怎么实现的?数据库索引越大越好吗?          需要详细...

数据库面试_三大索引

建立索引的优点: 1.大大加快数据的检索速度; 2.创建唯一性索引,保证数据库表中每一行数据的唯一性; 3.加速表和表之间的连接; …… 建立索引的目的是...

数据库常见的面试题

在整理准备数据库面试的过程中,先是在网上一顿海搜,找到历史面试题,然后一个骨头一个骨头的啃完,现在基本上这些问题(或者说叫做实践)都没有问题了。遇到的困难是:PL/SQL居多,T-SQL太少,所以需要...

数据库索引、B树、B+树

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结...
  • Marelin
  • Marelin
  • 2014年04月03日 17:10
  • 2047

探索B树/B+树与MySQL数据库索引的关系

本文主要讲述主轴线: 由搜索/查找联系到数据结构(搜索树,红黑书,B/B+树); 进行B/B+/RBtree的性能分析; 讲述一些关于数据从内存以及磁盘读取数据的数据存储管理的内容; 对数据库引擎My...
  • bitboss
  • bitboss
  • 2016年11月18日 17:40
  • 2432

数据库索引的实现原理(面试问题:请说出数据库索引实现原理)

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以...

数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)

B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3.非叶子结点的左指针指向小...

经典算法面试题(-)

快速排序 一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 3)从j开始向前搜索,即由...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试总结(数据库索引、B树、B+树)
举报原因:
原因补充:

(最多只允许输入30个字)