打造先進的記憶體KV資料庫 1 B樹索引的建立(1)

2021-07-09 01:40:21 字數 2463 閱讀 3235

在搜尋引擎的設計中,往往需要使用倒排索引,在當前記憶體**不斷走低的情況下,記憶體資料庫必然會成為主流。kv資料庫由於適合map-reduce用於分布式處理。

本系統設計實現如下目標:

* 實現極高效能的查詢

* 實現分布式集群儲存

* 實現可靠的日誌系統

索引採用b數索引,這樣做的目的是大大利用cpu的快取,讓每個節點的大小與cpu二級快取相匹配,另外,將索引值連續儲存在節點中,可以減少tlb失配的次數。由於b樹的結構,樹高不會太高,設想在16gb的記憶體中建立資料庫,資料庫使用8g記憶體,每條記錄1k,那麼就有8m個鍵,如果是每個節點儲存256個節點的b樹,那麼log256(8m)=3,樹高是3,每次查詢節點跳轉最多2次,節點內二分查詢是在快取記憶體中進行,快取記憶體的效率大約是裝載記憶體讀取的4~5倍(6000次查詢),節點內二分查詢的最大次數為8次,資料可能可以優化,在後續實驗中進行。

對於為搜尋引擎定製的資料庫,對於插入的效能要求不是很高,之前做過的實驗表明,爬取的效能瓶頸在於網路io,網路延遲遠遠大於資料庫插入,故可以犧牲插入效能來獲得較高的查詢效能。

以下是b樹索引的查詢以及部分插入實現:

//b_tree.go

package index

/* 最大程度提高查詢效率,忽略插入效率,插入效率被爬蟲爬取效率瓶頸

*/const (

l2_cache_size =256

*1024

//256kb l2快取

node_data_num = l2_cache_size /64

max_support_key_length =8

//最大支援8個位元組的關鍵字查詢

)type node struct

type b_tree struct

func (bt * b_tree) init()

type selecterror struct

func (se selecterror) error() (string)

//獲得hash值

//取前8個位元組作為hash

func hash(text byte) (uint64)

for i :=0;i < length;i++

return hash_

}//查詢指定索引 如果找到返回找到的node和position,失敗的話返回最近的node和position,

//並返回返回值相對於查詢值是大了還是小了 true->小 false->大 優先返回大 供插入時插在前面

func (bt *b_tree) select(index byte) (*node,int,uint64,error)

}hash_key := hash(index)

node_ := &bt.root

pos_r :=0

//返回位置

var err selecterror //返回錯誤

var node_r *node

for node_ != nil

if node_.hash_key[node_.hash_key_num -1] < hash_key

//進行二分查詢

pos := node_.hash_key_num /2

c := node_.hash_key_num /2

for else

if node_.hash_key[pos] < hash_key

c /=2

if c ==0

pos += c

} else

if node_.hash_key[pos] > hash_key

c /=2

if c ==0

pos -= c}}

}}

return node_r,pos_r,0,err

}func (bt *b_tree) set(text byte,primary_key uint64) (error) else else

node_.hash_key[pos] = hash(text)

node_.primary_key[pos] = primary_key

node_.hash_key_num++}}

//todo 空間不足的情況

}return

nil}

單元測試(未測試多層~待續)

package index

import (

_"fmt"

"testing"

)func expected(t *testing.t,expecting uint64,real uint64)

}func test_hash(t *testing.t) ))

}func test_select(t *testing.t)

func test_set(t *testing.t)

打造先進的記憶體KV資料庫 5 TCP偵聽

作為支援集群的資料庫,必定要與多個客戶端互動資訊,不可能讓資料庫與所有客戶共享位址空間 雖然這樣效能好 所以需要使用tcp協議進行互動資料,udp協議不可靠。棄用 c語言的tcp庫其實還好,但是對於高併發和並行的處理不如go,而且併發鎖機制比較難寫,所以使用go寫了伺服器和客戶端呼叫c的庫,目前版本...

資料庫原理剖析 序列1 B 樹

關係型資料庫在查詢方面有一些重要特性,是kv型的資料庫或者快取所不具備的,比如 1 範圍查詢。2 字首匹配模糊查詢。3 排序和分頁。這些特性的支援,要歸功於b 樹這種資料結構。下面來分析b 樹是如何支援這些查詢特性的。圖6 1展示了資料庫的主鍵對應的b 樹的邏輯結構,這個結構有幾個關鍵特徵 1 在葉...

資料庫採用B 樹而不是B 樹 b樹的原因

總結 1.不包含data 每頁的包含的內容會比較多,出度比較高.深度低,有效保證效能 2.葉子節點包含所有內容,便於全域性遍歷.原因 相對於b樹,1 b 樹空間利用率更高,可減少i o次數,一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查...