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