打造先进的内存KV数据库-1 B树索引的建立(1)

本文探讨了在内存数据库中构建B树索引以提高查询性能的设计目标和原因。通过优化节点大小以匹配CPU缓存,减少TLB失配,实现了高效的查询。在16GB内存中,8GB用于数据库,使用B树索引可以达到3层高度,提高查询速度。代码部分展示了B树索引的查询和部分插入实现,虽然插入性能被牺牲,但鉴于网络IO是爬取的瓶颈,此设计仍能提供显著的查询性能提升。
摘要由CSDN通过智能技术生成

设计目的

在搜索引擎的设计中,往往需要使用倒排索引,在当前内存价格不断走低的情况下,内存数据库必然会成为主流。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 {
    hash_key [node_data_num]uint64      //1/4
    hash_key_num int
    primary_key [node_data_num]uint64   //1/4
    child [node_data_num + 1]*node      //1/4
    is_leaf bool                        //0
}

type B_Tree struct {
    root node   //树根
    height int  //树高
}

func (bt * B_Tree) Init() {
    bt.height = 1
    bt.root.is_leaf = false
    bt.root.hash_key_num = 0
}

type SelectError struct {
    less bool
}

func (se SelectError) Error() (string) {
    return "not found"
}

//获得hash值
//取前8个字节作为hash
func hash(text []
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值