1. 資料庫系統維護著滿足特定查詢演算法
的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。索引的實現通常使用b樹及其變種b+樹。
建立索引可以大大提高系統的效能。
第一、通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
第二、可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。
第三、可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
第四、在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。
也許會有人要問:增加索引有如此多的優點,為什麼不對錶中的每乙個列建立乙個索引呢?因為,增加索引也有許多不利的方面。
第一、建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二、索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三、當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
2、b樹及b+樹
1)b樹
b樹中每個節點包含了鍵值和鍵值對於的資料物件存放位址指標,所以成功搜尋乙個物件可以不用到達樹的葉節點。
成功搜尋包括節點內搜尋和沿某一路徑的搜尋,成功搜尋時間取決於關鍵碼所在的層次以及節點內關鍵碼的數量。
在b樹中查詢給定關鍵字的方法是:首先把根結點取來,在根結點所包含的關鍵字k1,…,kj查詢給定的關鍵字(可用順序查詢或二分查詢法),若找到等於給定值的關鍵字,則查詢成功;否則,一定可以確定要查的關鍵字在某個ki或ki+1之間,於是取pi所指的下一層索引節點塊繼續查詢,直到找到,或指標pi為空時查詢失敗。
2)b+樹
b+樹非葉節點中存放的關鍵碼並不指示資料物件的位址指標,非葉節點只是索引部分。所有的葉節點在同一層上,包含了全部關鍵碼和相應資料物件的存放位址指標,且葉節點按關鍵碼從小到大順序鏈結。如果實際資料物件按加入的順序儲存而不是按關鍵碼次數儲存的話,葉節點的索引必須是稠密索引,若實際資料儲存按關鍵碼次序存放的話,葉節點索引時稀疏索引。
b+樹有2個頭指標,乙個是樹的根節點,乙個是最小關鍵碼的葉節點。所以 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 on(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; //刪除索引
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...