|
8 个月前 | ||
---|---|---|---|
.github/workflows | 删除 | 2 年前 | |
benchmarks | 删除 | 8 个月前 | |
cmake | 删除 | 5 年前 | |
db | 删除 | 8 个月前 | |
doc | 删除 | 3 年前 | |
fielddb | 删除 | 8 个月前 | |
helpers/memenv | 删除 | 3 年前 | |
include/leveldb | 删除 | 8 个月前 | |
issues | 删除 | 3 年前 | |
port | 删除 | 2 年前 | |
table | 删除 | 2 年前 | |
test | 删除 | 8 个月前 | |
testdb | 删除 | 8 个月前 | |
third_party | 删除 | 2 年前 | |
util | 删除 | 8 个月前 | |
.clang-format | 6 年前 | ||
.gitignore | 8 个月前 | ||
.gitmodules | 4 年前 | ||
3DB设计.md | 8 个月前 | ||
AUTHORS | 12 年前 | ||
CMakeLists.txt | 8 个月前 | ||
CONTRIBUTING.md | 3 年前 | ||
LICENSE | 14 年前 | ||
NEWS | 14 年前 | ||
README.md | 8 个月前 | ||
TODO | 13 年前 | ||
设计文档.md | 9 个月前 |
仓库地址 https://gitea.shuishan.net.cn/10225501448/leveldb_proj2
leveldb中的存储原本只支持简单的字节序列,在这个项目中我们对其功能进行拓展,使其可以包含多个字段,并通过这些字段实现类似数据库列查询的功能。但如果仅通过字段查找数据,需要对整个数据库的遍历,不够高效,因此还要新增二级索引,提高对特定字段的查询效率。
设计目标:对value存储读取时进行序列化编码,使其支持字段。
实现思路:设计之初有考虑增加一些元数据(例如过滤器、字段偏移支持二分)来加速查询。但考虑到在数据库中kv的数量是十分庞大的,新加数据结构会带来巨大的空间开销。因此我们决定在这里牺牲时间换取空间,而将时间的加速放在索引中。
在这一基础上,我们对序列化进行了简单的优化:将字段名排序后,一一调用leveldb中原本的编码方法PutLengthPrefixedSlice
存入value。这样不会有额外的空间开销,而好处在于遍历一个value的字段时,如果得到的字段名比目标大,就可以提前结束遍历。
std::string SerializeValue(const FieldArray& fields){
std::sort(sortFields.begin(), sortFields.end(), compareByFirst);
for (const Field& pairs : sortFields) {
PutLengthPrefixedSlice(&result, pairs.first);
PutLengthPrefixedSlice(&result, pairs.second);
}
return result;
}
最终db类提供了新接口putFields
, getFields
,分别对传入的字段序列化后调用原来的put
, get
接口。
FindKeysByField
调用NewIterator
遍历所有数据,field名和值符合则加入返回的key中。
这一部分的具体代码在util/serialize_value.cc中
设计目标:对某个字段(属性)建立索引,提高对该字段的查询效率。
fielddb
request
metadb
测试、分析、优化