10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
augurier 546578f82c 实验报告框架 8 月之前
.github/workflows Fix GitHub CI on Linux. 删除 2 年之前
benchmarks Merge branch 'cyq' into ld 删除 8 月之前
cmake Align CMake configuration with related projects. 删除 5 年之前
db 使用SliceHashTable代替unordered_set<string>,并增加了一些benchmark 删除 8 月之前
doc The master branch was renamed to main. 删除 3 年之前
fielddb 上条没注释完全 删除 8 月之前
helpers/memenv Remove main() from most tests. 删除 3 年之前
include/leveldb fielddb的benchmark、性能插桩以及一个对比的testdb 删除 8 月之前
issues Remove main() from most tests. 删除 3 年之前
port Support Zstd compression level in Leveldb 删除 2 年之前
table leveldb: Check slice length in Footer::DecodeFrom() 删除 2 年之前
test 插桩会影响恢复测试(env的问题)先注释了 删除 8 月之前
testdb 查出了性能测试destroy错误的问题 删除 8 月之前
third_party Roll third_party/benchmark to f7547e29ccaed7b64ef4f7495ecfff1c9f6f3d03 删除 2 年之前
util Merge branch 'cyq' into ld 删除 8 月之前
.clang-format Consolidate benchmark code to benchmarks/. 6 年之前
.gitignore fielddb的benchmark、性能插桩以及一个对比的testdb 8 月之前
.gitmodules Added google/benchmark submodule. 4 年之前
3DB设计.md 并发控制的基本框架和大部分实现 8 月之前
AUTHORS Release LevelDB 1.14 12 年之前
CMakeLists.txt fielddb的benchmark、性能插桩以及一个对比的testdb 8 月之前
CONTRIBUTING.md Update contributing guidelines. 3 年之前
LICENSE reverting disastrous MOE commit, returning to r21 14 年之前
NEWS sync with upstream @ 21409451 14 年之前
README.md 实验报告框架 8 月之前
TODO Update to leveldb 1.6 13 年之前
设计文档.md 分工与补充 9 月之前

README.md

实验报告

仓库地址 https://gitea.shuishan.net.cn/10225501448/leveldb_proj2

1. 项目概述

leveldb中的存储原本只支持简单的字节序列,在这个项目中我们对其功能进行拓展,使其可以包含多个字段,并通过这些字段实现类似数据库列查询的功能。但如果仅通过字段查找数据,需要对整个数据库的遍历,不够高效,因此还要新增二级索引,提高对特定字段的查询效率。

2. 功能实现

2.1 字段

设计目标:对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中

2.2 二级索引

设计目标:对某个字段(属性)建立索引,提高对该字段的查询效率。

2.2.1 总体架构

fielddb

2.2.2 如何并发创删索引与读写

request

2.2.3 如何保证两个kv与index的一致性

metadb

3. 测试

3.1 正确性测试

3.2 性能测试

测试、分析、优化

4. 问题与解决

5. 潜在优化点

6. 分工