構建乙個簡單的資料庫系列(七)引入B tree

2021-09-13 14:14:32 字數 2422 閱讀 9364

b-tree是sqlite用來表示表和索引的資料結構,因此它是乙個非常重要的想法。

為什麼樹對資料庫來講是非常合適的資料結構呢?

批註:b-tree中的b是指balanced,而不是binary。後者是2叉樹,每個節點最多只有2個子節點,而前者可以有2個以上的字節點,記為m,為了保持樹大部分平衡,我們還說節點必須至少有m / 2個孩子(四捨五入)。

例外:

上面的是乙個b-tree,sqlite用它來儲存索引。為了儲存表,sqlites使用稱為b +樹的變體。

b-tree

b+ tree

pronounced

「bee tree」

「bee plus tree」

used to store

indexes

tables

internal nodes store keys

yesyes

internal nodes store values

yesno

number of children per node

less

more

internal nodes vs. leaf nodes

same structure

different structur

統一2個概念:

internal nodes:內部節點(分枝節點),即擁有孩子節點,leaf nodes:葉子節點,即沒有孩子節點,區別如下:

for an order-m tree…

internal node

leaf node

stores

keys and pointers to children

keys and values

number of keys

up to m-1

as many as will fit

number of pointers

number of keys + 1

none

number of values

none

number of keys

key purpose

used for routing

paired with value

stores values?

noyes

讓我們通過乙個例子來看看在插入元素時b樹是如何增長的。為了簡單起見,樹將是訂單3.這意味著:

空b樹具有單個節點:根節點。根節點作為具有零鍵/值對的葉節點開始:

空的btree

如果我們插入幾個鍵/值對,它們將按排序順序儲存在葉節點中。

單節點btree

假設葉節點的容量是兩個鍵/值對。當我們插入另乙個時,我們必須拆分葉節點並在每個節點中放置一半對。兩個節點都成為新內部節點的子節點,現在它將成為根節點。

兩級btree

內部節點有1個鍵和2個指向子節點的指標。如果我們想要查詢小於或等於5的鍵,我們會檢視左邊的孩子。如果我們想要查詢大於5的key,我們會找到右邊的孩子。

現在讓我們插入鍵「2」。首先,如果它存在,我們將查詢它將在哪個葉節點,並且我們到達左葉節點。節點已滿,因此我們拆分葉節點並在父節點中建立新條目。

四節點btree

讓我們繼續新增key。我們到了必須再次拆分的地步,但父節點中沒有空間用於另乙個鍵/指針對。

內部節點沒有空間

解決方案是將根節點拆分為兩個內部節點,然後建立新的根節點作為其父節點。

當我們拆分根節點時,樹的深度才會增加。每個葉節點具有相同的深度並且接近相同數量的鍵/值對,因此樹保持平衡並且快速搜尋。

在我們實現插入之後,我將推遲討論從樹中刪除key的問題。

當我們實現這個資料結構時,每個節點將對應乙個頁面。根節點將存在於第0頁中。子指標將只是包含子節點的頁碼。

下一次,我們開始實施btree!

實現乙個簡單的資料庫

所有應用軟體之中,資料庫可能是最複雜的。mysql的手冊有3000多頁,postgresql的手冊有2000多頁,oracle的手冊更是比它們相加還要厚。但是,自己寫乙個最簡單的資料庫,做起來並不難。reddit上面有乙個帖子,只用了幾百個字,就把原理講清楚了。下面是我根據這個帖子整理的內容。第一步...

乙個備份MySQL資料庫的簡單Shell指令碼

shell指令碼是我們寫不同型別命令的一種指令碼,這些命令在這乙個檔案中就可以執行。我們也可以逐一敲入命令手動執行。如果我們要使用shell指令碼就必須在一開始把這些命令寫到乙個文字檔案中,以後就可以隨意反覆執行這些命令了。我首先要在本文帶給你的是完整指令碼。後面會對該指令碼做說明。我假定你已經知道...

乙個備份MySQL資料庫的簡單Shell指令碼

shell指令碼是我們寫不同型別命令的一種指令碼,這些命令在這乙個檔案中就可以執行。我們也可以逐一敲入命令手動執行。如果我們要使用shell指令碼就必須在一開始把這些命令寫到乙個文字檔案中,以後就可以隨意反覆執行這些命令了。我首先要在本文帶給你的是完整指令碼。後面會對該指令碼做說明。我假定你已經知道...