索引與雜湊

2021-06-14 01:32:21 字數 2759 閱讀 4703

在資料庫中,當資料量很小的時候,直接查詢是沒有任何問題的,但是如果當資料庫中有很多資料的時候,直接查詢就不那麼有效了,為了提高查詢速度,資料庫支援了索引以提高資料庫的查詢速度。

索引有兩種基本型別,有序索引和雜湊索引。有序索引是基於值的排序順序建立;雜湊索引是將值平均分布到若干個桶中,某個值屬於哪乙個桶由乙個雜湊函式決定,該函式稱為雜湊函式。

對於使用哪一種索引技術更好並沒有一定之規,對於要使用哪一種技術根據具體的場合而定,主要要考慮這些因素:訪問時間、插入時間、刪除時間和空間開銷。

有序索引

有序索引即是將搜尋碼按照一定的順序儲存索引碼的值,並將搜尋碼與搜尋碼對應的記錄關聯起來。

索引記錄(索引項):由乙個搜尋碼值和指向具有該搜尋碼值的乙個或者多個記錄的指標構成。

有序索引按索引記錄的順序與記錄本身的順序關係可以分為主索引(也稱聚集索引)和輔助索引(也稱非聚集索引)。索引記錄的順序與記錄本身的順序一致時稱為主索引,索引記錄的順序與記錄本身的順序不一致時稱為輔助索引。

有序索引按每個搜尋碼是否有都有索引記錄可以分為稠密索引稀疏索引。如果每個搜尋碼都有乙個索引記錄,則索引為稠密索引。如果只為其中一部分搜尋碼建立索引,則索引為稀疏索引。對於主索引來說,沒有必要使用稠密索引,使用稀疏索引就可以了。

使用稠密索引可以比使用稀疏索引更快的定位記錄,但是稀疏索引卻比稠密索引節省了很多空間,所以在設計時需要在時間和空間之間進行權衡再做出選擇。

多級索引

即使在使用索引的情況下,當資料庫中的資料太多的時候,索引表也是相當大的,在索引表中搜尋索引記錄也是需要很多時間的。當索引表很大的時候,則無法將索引表全部載入到記憶體中,所以需要在磁碟中去搜尋索引表。這樣在時間上的開銷還是很大的。所以需要引入多級索引的技術,對於多級索引學過資料結構的應該能夠理解,類似於資料結構中的樹形結構,這裡就不再過多闡述。

對於多級索引的建立需要考慮深度和廣度。如果不能多級索引的深度和廣度進行限制,則多級索引達不到預期的效果。

b+樹索引檔案

b+樹索引檔案是多級索引的一種,是使用最廣泛的在資料插入和刪除的情況下仍能保持其執行效率的幾種索引結構之一。b+樹索引檔案採用平衡樹結構,其中樹根到樹葉的每條路徑的長度相同。樹中每個非葉節點至少有n/2個子女,最多有n個子女,n是建立結構時規定的乙個整數,對於特定的結構來說是固定的。

對於b+樹索引檔案來說,每乙個非葉子節點都是乙個稀疏索引,要使b+樹索引檔案成為乙個稠密索引,每乙個搜尋碼值都必須出現在乙個葉節點中。每乙個非葉子節點都包含了數量為子樹數目減1的索引記錄。例如乙個非節點包含m個指標,則該節點則包含m-1個索引記錄。其中第乙個索引指標指向的子樹中的所有記錄的搜尋碼都小於第乙個索引記錄的搜尋碼,最後乙個索引指標指向的子樹中的所有記錄都大於或等於最後乙個索引記錄的搜尋碼。

b+樹上的查詢

知道了b+樹的結構,想要在b+樹上進行查詢就不難了,這裡也就不過多的闡述。

b+樹上的更新

b+樹的更新操作包括插入和刪除兩種操作。

插入時先通過查詢找到要插入的搜尋碼將要屬於哪乙個葉結點,然後再進行插入。當插入時需要考慮一種情況,即對應的葉節點的指標個數大於n的話,則需要將對應的葉節點**為兩個葉節點,**後可能導致其父節點的指標個數增加而使其**,所以**可能會級聯進行。如果根節點**了,則樹的深度就增加了1。

刪除時先通過查詢找到刪除的搜尋碼所屬的葉結點,然後將其從對應的葉結點中刪除。當刪除時需要考慮一種情況,即對應的葉節點的指標個資料小於n/2的話,由需要將對應的葉節點與相鄰的葉節點進行合併。但合併全可能會合併後的結果的指標個資料太多,這時候需要對兩個節點進行重新分布,使兩個節點的指標個數都不會過多或過少。兩個節點的合併可能會導致父節點合併或重新分布,而兩個節點重新分布則會導致父節點的搜尋碼改變。

靜態雜湊

使用有序索引的必須使用索引結構來定位資料,這就必須使用到搜尋,將導致很多i/o操作。

靜態雜湊將一條或多種記錄放入乙個叫「」的儲存單位中。通過乙個雜湊函式可以根據搜尋碼直接計算出對應的記錄所屬的桶的位址。

選擇的雜湊函式對效率的影響是很大的。最壞的情況就是所有的記錄都在同乙個桶裡,在這種情況下雜湊表就失去了它應有的價值。最好的情況就是所有的記錄平均分布到所有的桶中。乙個好的雜湊函式應該具備這兩個性質:分布是均勻的。也就是說,雜湊函式為每個桶分配所有可能的搜尋碼值集合中的同樣數量的搜尋碼值。分布是隨機的。也就是說,不管搜尋碼值怎樣分布,每個桶應該分配到的搜尋碼值的數目幾乎相同。

桶溢位

如果桶沒有足夠的空間,就會發生桶溢位。桶溢位可能是桶不足造成,也可能是桶偏斜造成。桶偏斜可能是因為某些記錄具有相同的搜尋碼造成,也可能是因為所選的雜湊函式造成搜尋碼分布不均勻造成。為了減少桶溢位的可能性,一般會分配比實際所需要的桶的數目多的桶。即使是這樣,也還是會有桶溢位的情況發生。

當發生桶溢位時,可以有兩種處理方式,一是增加乙個溢位桶,將記錄插入到溢位桶中,如果溢位桶也滿了,則再增加乙個,乙個給定的桶的所有的桶通過乙個鍊錶鏈結在一起,就形成了溢位鏈。第二種方法就是將記錄插入到其他桶中。使用溢位鏈的雜湊結構稱為閉雜湊,不使用溢位鏈的雜湊稱為開雜湊

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql雜湊索引用途 MySQL 雜湊索引

雜湊索引基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。在mysql中只有memory引擎顯示支援雜湊索引,也是memory引擎表的預設索引型別。memory引擎是支援非唯一雜湊索引的。如果多個列的雜湊值相同,索引會以鍊錶 的方式存放多個記錄指標道同乙個雜湊條目中。舉個粒子 create tab...

索引和雜湊

順序索引 1 稠密索引 對應檔案中搜尋碼的每乙個值有乙個索引記錄。索引記錄包括搜尋碼值以及指向具有該搜尋碼值的第乙個資料記錄的指標。可更快定位記錄。2 稀疏索引 只為搜尋碼的某些值建立索引記錄。佔空間較小,插入和刪除時的維護開銷較小。多級索引 在主索引上構造乙個稀疏索引,如果要搜尋乙個記錄,首先在外...