一、數(shù)據(jù)庫中的索引條目(index entry)是什么
對于葉子節(jié)點(diǎn)塊來說,其所包含的索引條目與分支節(jié)點(diǎn)一樣,都是按照順序排列的(缺省是升序排列,也可以在創(chuàng)建索引時指定為降序排列)。每個索引條目(也可以叫做每條記錄)也具有兩個字段。名列前茅個字段表示索引的鍵值,對于單列索引來說是一個值;而對于多列索引來說則是多個值組合在一起的。第二個字段表示鍵值所對應(yīng)的記錄行的ROWID,該ROWID是記錄行在表里的物理地址。如果索引是創(chuàng)建在非分區(qū)表上或者索引是分區(qū)表上的本地索引的話,則該ROWID占用6個字節(jié);如果索引是創(chuàng)建在分區(qū)表上的全局索引的話,則該ROWID占用10個字節(jié)。
知道這些信息以后,我們可以舉個例子來說明如何估算每個索引能夠包含多少條目,以及對于表來說,所產(chǎn)生的索引大約多大。對于每個索引塊來說,缺省的PCTFREE為10%,也就是說非常多只能使用其中的90%。同時9i以后,這90%中也不可能用盡,只能使用其中的87%左右。也就是說,8KB的數(shù)據(jù)塊中能夠?qū)嶋H用來存放索引數(shù)據(jù)的空間大約為6488(8192×90%×88%)個字節(jié)。
假設(shè)我們有一個非分區(qū)表,表名為warecountd,其數(shù)據(jù)行數(shù)為130萬行。該表中有一個列,列名為goodid,其類型為char(8),那么也就是說該goodid的長度為固定值:8。同時在該列上創(chuàng)建了一個B樹索引。
在葉子節(jié)點(diǎn)中,每個索引條目都會在數(shù)據(jù)塊中占一行空間。每一行用2到3個字節(jié)作為行頭,行頭用來存放標(biāo)記以及鎖定類型等信息。同時,在名列前茅個表示索引的鍵值的字段中,每一個索引列都有1個字節(jié)表示數(shù)據(jù)長度,后面則是該列具體的值。
延伸閱讀:
二、索引原理
索引的存儲原理大致可以概括為一句話:以空間換時間。
一般來說索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往是存儲在磁盤上的文件中的(可能存儲在單獨(dú)的索引文件中,也可能和數(shù)據(jù)一起存儲在數(shù)據(jù)文件中)。
數(shù)據(jù)庫在未添加索引進(jìn)行查詢的時候默認(rèn)是進(jìn)行全文搜索,也就是說有多少數(shù)據(jù)就進(jìn)行多少次查詢,然后找到相應(yīng)的數(shù)據(jù)就把它們放到結(jié)果集中,直到全文掃描完畢。