索引主要分为 hashTable, Rtree, Ttree
hashTalbe 比较简单,直接看代码就行
Rtree 就是最简单的Rtree实现,和从网上找到的其它代码区别不大,没有R*tree, R+tree之类的改进,现在默认是两维,查询是根据递归实现的,删除的时候,也是先删除,之后再最新插入
下面主要分析Ttree,请先看下面的论文
A study of index structures for main memory database management systems
以及文档中的Ttree部分;
Ttree只用到了两个类,
class FASTDB_DLL_ENTRY dbTtree {
protected:
oid_t root;
......
}
dbTtree 只有一个字段,指向根页面dbTtreeNode
class FASTDB_DLL_ENTRY dbTtreeNode {
enum {
pageSize = 125,
minItems = pageSize - 2 // minimal number of items in internal node
};
public:
oid_t left;
oid_t right;
int1 balance;
nat2 nItems;
oid_t item[pageSize];
.......
}
dbTtreeNode 中 left 和 right 指向最左和最右对应的dbTtreeNode 页面,item 是oid的数组,指向一个一个的元组,nItems 是tiem中数组的实际使用个数
查找比较简单,
就是把查找的 key 先与 item[0] 对应的元组比较,小的话,就从左边子树查找,大的话,就再与 item[nItems -1] 比较,大的话,就去右边子树查找,小的话,就在item[0] 和 [nItems -1] 查看是否存在满足条的的元组,这和一般的树的查找区别不大
插入的过程中,位于树的中间结点也存储了元组,而不是指向下一层结点的指针,这样的话,当插入的顺序不一样的话,树的结构也就不一样,另一方面就是,当不是AVL树之后,就旋转,
删除的操作就是多了一个旋转的过程,别的和普通的树差别不大
由于多了一步旋转的操作,旋转时要读入与之相邻的祖先或子孙结点,所以Ttree比较适合在内存中