1. 程式人生 > >資料庫B樹索引的工作原理

資料庫B樹索引的工作原理

什麼是B樹?

B樹是一種資料結構,它按排序順序在其節點中儲存資料。我們可以如下表示樣本B樹。

樣本B樹

B樹儲存資料,使得每個節點按升序包含金鑰。這些鍵中的每一個都有兩個對另外兩個子節點的引用。Te左側子節點鍵小於當前鍵,右側子節點鍵多於當前鍵。如果單個節點具有“n”個鍵,則它可以具有最大“n + 1”個子節點。

為什麼索引在資料庫中使用?

想象一下,您需要在檔案中儲存一個數字列表,並在該列表中搜索給定的數字。最簡單的解決方案是將資料儲存在陣列中,並在新值到來時附加值。但是,如果需要檢查陣列中是否存在給定值,則需要逐個搜尋所有陣列元素並檢查給定值是否存在。如果你足夠幸運,你可以在第一個元素中找到給定的值。在最壞的情況下,該值可以是陣列中的最後一個元素。我們可以將這種最壞的情況表示為漸近符號中的O(n)。這意味著如果您的陣列大小最多為“n”,則需要執行“n”次搜尋才能在陣列中查詢給定值。

你怎麼能改善這個時間?最簡單的解決方案是對陣列進行排序並使用二進位制搜尋來查詢值。每當您向陣列中插入一個值時,它應該保持順序。通過從陣列中間選擇一個值來搜尋。然後將所選值與搜尋值進行比較。如果所選值大於搜尋值,則忽略陣列的左側並搜尋右側的值,反之亦然。

二進位制搜尋

在這裡,我們嘗試從陣列3,6,8,11,15和18中搜索鍵15,它已經按排序順序搜尋。如果進行普通搜尋,則由於元素位於第五位,因此需要五個單位的時間進行搜尋。但在二進位制搜尋中,只需要三次搜尋。

如果我們將這個二進位制搜尋應用於陣列中的所有元素,那麼它將如下所示。

二進位制搜尋所有元素

看起來熟悉?它是一棵二叉樹。這是B樹的最簡單形式。對於二叉樹,我們可以使用指標而不是將資料儲存在已排序的陣列中。在數學上,我們可以證明二叉樹的最壞情況搜尋時間是O(log(n))。二叉樹的概念可以擴充套件為更通用的形式,稱為B樹。B-tree不是為單個節點提供單個條目,而是為單個節點使用條目陣列,併為每個條目引用子節點。以下是每種預先描述的方法的一些時間複雜度比較。

型別

插入

刪除

擡頭

未排序的陣列

O(1)

上)

上)

排序陣列

上)

上)

O(日誌(N))

B樹

O(日誌(N))

O(日誌(N))

O(日誌(N))

B +樹是另一種用於儲存資料的資料結構,它看起來與B樹幾乎相同。B +樹的唯一區別是它將資料儲存在葉節點上。這意味著所有非葉節點值再次在葉節點中重複。下面是一個B +樹樣本。

B +樹

在葉節點中再次重複13,30,9,11,16和38個非葉值。你能看到葉子節點上這棵樹的特色嗎?

是的,葉節點包括所有值,所有記錄都按排序順序排列。在B +樹的專業中,您可以執行與B樹相同的搜尋,此外,如果我們將指標指向每個葉節點,您可以遍歷葉節點中的所有值,如下所示。

B +樹與葉節點引用

B +樹與葉節點引用

如何在資料庫中使用索引?

當B-tree進入資料庫索引時,這個資料結構變得有點複雜,不僅有一個鍵,還有一個與鍵相關的值。該值是對實際資料記錄的引用。金鑰和值一起稱為有效負載。

假設以下三列表需要儲存在資料庫中。

名稱

標記

年齡

28

亞歷克斯

32

45

湯姆

37

23

羅恩

87

13

標記

20

48

短髮

89

32

首先,資料庫為每個給定記錄建立唯一的隨機索引(或主鍵),並將相關行轉換為位元組流。然後,它將每個金鑰儲存在B +樹上並記錄位元組流。這裡,隨機索引用作索引的關鍵。金鑰和記錄位元組流完全稱為有效負載。得到的B +樹可以表示如下。

資料庫頁面上的B +樹

在這裡,您可以看到所有記錄都儲存在B +樹的葉節點中,索引用作建立B +樹的關鍵字。沒有記錄儲存在非葉節點上。每個葉節點都引用樹中的下一個記錄。資料庫可以通過使用索引或順序搜尋來執行二進位制搜尋,方法是僅通過遍歷葉節點搜尋每個元素。

如果未使用索引,則資料庫將讀取每個記錄以查詢給定記錄。啟用索引時,資料庫會為表中的每個列建立三個B樹,如下所示。這裡的關鍵是用於索引的B樹金鑰。索引是對實際資料記錄的引用。

首先使用索引時,資料庫會根據B-tree搜尋給定的金鑰,並在O(log(n))時間內獲取索引。然後,它通過在O(log(n))時間內使用已經找到的索引在B +樹中執行另一次搜尋並獲取記錄。

B-tree和B +樹中的每個節點都儲存在Pages內。頁面大小固定。頁面從一個開始有一個唯一的編號。頁面可以使用頁碼對另一頁面的引用。在頁面的開頭,儲存頁面元細節,例如最右邊的子頁面編號,第一個空閒單元格偏移量和第一個單元格偏移量。資料庫中可以有兩種型別的頁面:

  1. 索引頁面:這些頁面僅儲存索引和對另一頁面的引用。

  2. 儲存記錄的頁面:這些頁面儲存實際資料,頁面應該是葉子頁面。

使用SQLite B樹索引

建立B樹索引的基本語法如下

CREATE  INDEX  index_name  ON  table_name ;


SQLite中使用的索引方法有三種,如下所示。

1.單列索引

這裡,索引是基於一個表列建立的。只為索引建立了一個Btree。語法如下。

CREATE  INDEX  index_name  ON  table_name(column_name);

 

2.獨特的指數

不允許唯一索引儲存使用索引的列的重複值。語法可以寫成如下。

table_name(column_name)上建立UNIQUE  INDEX  index_name  ; 

 

3.綜合指數

 這種型別的索引可以有多個索引。對於每個索引列,都存在Btree。以下是複合索引的語法

 table_name 上的CREATE INDEX  index_name (column1,column2); 

 

結論

資料庫應該有一種有效的方式來儲存,讀取和修改資料。B樹提供了插入和讀取資料的有效方法。在實際的資料庫實現中,資料庫同時使用B樹和B +樹來儲存資料。用於索引的B樹和用於儲存實際記錄的B +樹。除了二進位制搜尋之外,B +樹還提供順序搜尋功能,這使資料庫能夠更好地控制資料庫中的非索引值。