【摘錄】index(一)

yellowlee發表於2010-01-31

找了一些索引方面的資料,從基本原理到管理。

來自 chinaunix,itpub,oracle官方文件

1,基本原理
B-tree的定義及其查詢
1.B-tree及其查詢
B-tree是一種平衡的多路查詢樹,它在檔案系統中經常使用。下面簡單介紹下這種樹的結構及查詢演算法。
一顆M階的B-tree,或為空樹,或滿足下列特性:
(1)       樹中每個結點至多有m棵子樹;
(2)       若根結點不是葉子結點,則至少有兩棵子樹;
(3)       除根之外的所有非終端結點至少有[m/2]棵子樹;
(4)       所有的非終端結點中包含下列資訊資料
(n,A0,K1,A1,K2,A2,---,KN,AN)
其中:Ki(i=1,---,n)為關鍵字,且Ki且指標Ai-1所指子樹中所有結點的關鍵字均小於Ki(i=1,---,n),An所指子樹中所有結點的關鍵字均大於Kn,n([m/2]-1<=n<=m-1)
為關鍵字的個數(或n+1為子樹的個數)。
(5)       所有的葉子結點都出現在同一層次上,並且不帶資訊(可以看作是外部結點或查詢失敗的結點,實際上這些結點是不存在的,
指向這些結點的指標為空)。
在B-tree上進行查詢的過程是一個順指標查詢結點和在結點的關鍵字中進行查詢交叉進行的過程。
以下是一個結點型別的說明:
#define  m  3                     //3定義樹的階數
Typedef struct BTNode {
    Int           keynum;          // 定義關鍵字的個數即結點的大小
    Struct  BTNode *parent;          // 指向父結點
    Key Type      key[m+1];         // 關鍵字向量
    Struct  BTNode *ptr[m+1];        // 子樹指標向量
    Record        *recptr[m+1];      // 記錄指標向量
}BTNode, *BTree;                   // B-tree結點和B-樹的型別
         Typedef struct {
              BTNode *pt;                   //指向找到的結點
              Int       i;                  //1….m,結點中的關鍵字序號
              Int       tag;                  // 結果標誌 1:成功,0:查詢失敗
          }Result;                            //B-tree的查詢結果型別      
下面簡單的描述下查詢操作的實現:
Result SearchBTree(BTree T,KeyType K) {
    P=T;  q=NULL;  found=FALSE;  i=0; //初始化,p指向待查結點,q指向p的雙親
    While (p&&!found) {
         I=Search(p,k);                  //在p->key[1…keynum]中查詢,
                                       // i使得:p->key[i]<=kkey[i+1]
         If(i>0&&p->key[i]= =k) found=TRUE;  //找到待查關鍵字
           Else {q=p;p=p->ptr[i];}
 }
      If(found) return (p,i,1);                //查詢成功
        Else return(q,i,0);                   //查詢不成功返回k的插入資訊
    }


Oracle 使用平衡樹(B-tree)儲存索引以便提升資料訪問速度。當不使用索引時,
使用者必須對資料進行順序掃描(sequential scan)來查詢指定的值。如果有 n 行資料,那麼平均需要掃描的行為 n/2。
因此當資料量增長時,這種方法的開銷將顯著增長。

如果將一個已排序的值列(list of the values)劃分為多個區間(range),每個區間的末尾包含指向下個區間的指標(pointer),
而搜尋樹(search tree)中則儲存指向每個區間的指標。此時在 n 行資料中查詢一個值所需的時間為 log(n)。
這就是 Oracle 索引的基本原理。

在一個平衡樹索引(B-tree index)中,最底層的索引塊(葉塊(leaf block))儲存了被索引的資料值,以及對應的 rowid。
葉塊之間以雙向連結串列的形式相互連線。位於葉塊之上的索引塊被稱為分支塊,分枝塊中包含了指向下層索引塊的指標。
如果被索引的列儲存的是字元資料,那麼索引值為這些字元資料在當前資料庫字符集中的二進位制值。

對於唯一索引,每個索引值對應著唯一的一個 rowid。對於非唯一索引,每個索引值對應著多個已排序的 rowid。因此在非唯一索引中,
索引資料是按照索引鍵(index key)及 rowid 共同排序的。鍵值(key value)全部為 NULL 的行不會被索引,
只有點陣圖索引(bitmap index)和簇索引(cluster index)例外。在資料表中,如果兩個資料行的全部鍵值都為 NULL,
也不會與唯一索引相沖突。

有兩種型別的索引塊:
1、用於搜尋的分支塊(branch block)
2、用於儲存索引資料的葉塊(leaf block)

分支塊中儲存以下資訊:
1、最小的鍵值字首,用於在(本塊的)兩個鍵值之間做出分支選擇。
2、指向包含所查詢鍵值的子塊的指標。

包含 n 個鍵值的分支塊含有 n+1 個指標。鍵值及指標的數量同時還受索引塊容量的限制。

所有葉塊相對於其根分支塊的深度是相同的。

葉塊用於儲存以下資訊:
1、資料行的鍵值(key value) 。
2、鍵值對應資料行的 ROWID 。

所有的 鍵值-ROWID 對都與其左右的兄弟節點向連結,並按照(key,ROWID)的順序排序。

平衡樹資料結構(B-tree structure)具有以下優勢:
1、平衡樹(B-tree)內所有葉塊的深度相同,因此獲取索引內任何位置的資料所需的時間大致相同。
2、平衡樹索引(B-tree index)能夠自動保持平。
3、平衡樹內的所有塊的使用容量平均在塊總容量的 3/4 左右。
4、在大區間範圍內進行查詢時,無論匹配個別值還是搜尋一個區間,平衡樹都能提供較好的查詢效能。
5、資料插入(insert),更新(update),及刪除(delete)的效率較高,且易於維護鍵值的順序。
6、大型表,小型表利用平衡樹進行搜尋的效率都較好,且搜尋效率不會因資料增長而降低。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-626479/,如需轉載,請註明出處,否則將追究法律責任。

相關文章