|
|
@ -11,7 +11,7 @@ leveldb中的存储原本只支持简单的字节序列,在这个项目中我 |
|
|
|
在这一基础上,我们对序列化进行了简单的优化:将字段名排序后,一一调用leveldb中原本的编码方法`PutLengthPrefixedSlice`存入value。这样不会有额外的空间开销,而好处在于遍历一个value的字段时,如果得到的字段名比目标大,就可以提前结束遍历。 |
|
|
|
最终db类提供了新接口`putFields`, `getFields`,分别对传入的字段序列化后调用原来的`put`, `get`接口。 |
|
|
|
**`FindKeysByField`调用`NewIterator`遍历所有数据,field名和值符合则加入返回的key中。这里的问题在于遍历中可能符合条件的key之前已经被删了,所以还要维护一个被删的key数组?总感觉这个玩意性能有点太差了** |
|
|
|
|
|
|
|
**cyq:如果考虑mvcc的话,感觉好像不用担心遍历过程中的问题** |
|
|
|
## 2.2 二级索引 |
|
|
|
设计目标:对某个字段或属性建立索引,提高对该字段的查询效率。需考虑索引的创建、删除、维护。 |
|
|
|
|
|
|
@ -38,6 +38,7 @@ class FieldDb { |
|
|
|
有`fieldWithIndex`中有的字段,则直接对`kvDb`调用一个(多个)`put`。 |
|
|
|
`delete`也是如此,创建删除索引时新来的要delete的数据由`tmpDeletekvs`维护。 |
|
|
|
**只考虑到这,理论上每个数据库内部的日志、快照、合并等模块不会互相影响(创建的那些current、manifest文件名好像会冲突)** |
|
|
|
**cyq:这个问题比较好解决,其实只要把两个数据库放到两个不同的子目录里面就可以了。 但是这里有个问题是,先putfields后,index加入tmpAddkvs前有对于索引的读取,那么会不会有不一致的问题** |
|
|
|
|
|
|
|
# 3. 数据结构设计 |
|
|
|
`indexDb`的kv编码:**暂时考虑助教文档那种** |
|
|
|