1. 程式人生 > >面試總結(資料庫索引、B樹、B+樹)

面試總結(資料庫索引、B樹、B+樹)

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+樹是應檔案系統所需而產生的一種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;     //刪除索引