面试总结(数据库索引、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+、B-树

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

Spring Data REST入门(三):自定义配置

Spring Data REST入门(一):两行代码搞定RESTFul Spring Data REST入门(二):环境搭建+实战演练 一、基础配置 Spring Data REST的基...

缓存在高并发场景下的常见问题

缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的...

ORACLE B树索引概念的理解

B树索引的概念: B树索引是一个典型的树结构,不紧oracle,很多实际应用都用到,在oracle里面分三个索引块 1 - 叶子节点块(leaf block):直接指向表里的数据行。 2 - 分支节点...

面试总结(变量初始化、整型数范围)

1. 在全局域中声明的变量会自动初始化为0,如:   double salary; int day; 2. 如果变量是在局部域中定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0,这些...

Gucci Wallets 181669 1060 Improper construction workers due to be five meters long steel shaft pierced the abdomen

□ reporter Guo Changxiu ,Gucci bag Classic 131024 correspondent Zhang construction paper map Jiaozu...

数据库索引的实现原理

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

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

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

Spring Data REST入门(一):两行代码搞定RESTFul

Spring Data REST入门(一) Spring Data REST入门(二) Spring Data REST入门(三) Spring Data REST入门(四) 什么是Spring...

如果有人问你数据库的原理,叫他看这篇文章

一提到关系型数据库,我禁不住想:有些东西被忽视了。关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata 。但很少有文章讲解数据库是如何工作的。你可以自己谷歌/百度...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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