TCTDB存储结构

TCTDB是tokyo cabinet家族中的表格数据库(如上图),其实现基于TCHDB(hash database)和TCBDB(B-tree database)。

20196318_131608586690m6.jpg

TCHDB参考:http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=327754

TCBDB的代码没有读过,有时间也阅读一下,其结构如下图所示。


20196318_1316085910zfZX.jpg

 

TCTDB的主要特性:

1.  松散表格实现,以primary key标示表格的一行,每行包括多列,列以名字标示。

行的存储使用TCHDB,把所有的行作为一个value(在内存中是一个mapmap中为多个列的列名以及列值)存储,更新时,也必须整体更新,即使是单个colomn的更新也需要把整体读出来更新其中的部分信息。

2. 灵活的数据结构,所有的数据结构都作为char[]存储,no schemano data type

3.  查询机制,实现多种查询操作(字符串匹配,正则,整数比较等),结果可按列字段排序。

4.  列索引,通过TCBDB存储基于列的索引,查询机制基于列索引(tokeq-gram),先后去对应列的索引倒排表,然后在表中进行匹配。


查询支持的匹配方式

enum {                                   /* enumeration for query conditions */

  TDBQCSTREQ,                            /* string is equal to */

  TDBQCSTRINC,                           /* string is included in */

  TDBQCSTRBW,                            /* string begins with */

  TDBQCSTREW,                            /* string ends with */

  TDBQCSTRAND,                           /* string includes all tokens in */

  TDBQCSTROR,                            /* string includes at least one token in */

  TDBQCSTROREQ,                          /* string is equal to at least one token in */

  TDBQCSTRRX,                            /* string matches regular expressions of */

  TDBQCNUMEQ,                            /* number is equal to */

  TDBQCNUMGT,                            /* number is greater than */

  TDBQCNUMGE,                            /* number is greater than or equal to */

  TDBQCNUMLT,                            /* number is less than */

  TDBQCNUMLE,                            /* number is less than or equal to */

  TDBQCNUMBT,                            /* number is between two tokens of */

  TDBQCNUMOREQ,                          /* number is equal to at least one token in */

  TDBQCFTSPH,                            /* full-text search with the phrase of */

  TDBQCFTSAND,                           /* full-text search with all tokens in */

  TDBQCFTSOR,                            /* full-text search with at least one token in */

  TDBQCFT***,                            /* full-text search with the compound expression of */

  TDBQCNEGATE = 1 << 24,                 /* negation flag */

  TDBQCNOIDX = 1 << 25                   /* no index flag */

};

 

TC支持多种类型查询,匹配主要基于字符串和数值,字符串的匹配支持正则表达式,部分匹配,前向/后向匹配;数值的主要基于比较运算符。

 

结果排序方式

enum {                                   /* enumeration for order types */

  TDBQOSTRASC,                           /* string ascending */

  TDBQOSTRDESC,                          /* string descending */

  TDBQONUMASC,                           /* number ascending */

  TDBQONUMDESC                           /* number descending */

};

 

TCTDB可对查询结果进行排序,支持以上四种方式的排序,按字符串升降序,按数值升降序。

 

索引类型

enum {                                   /* enumeration for index types */

  TDBITLEXICAL,                          /* lexical string */

  TDBITDECIMAL,                          /* decimal string */

  TDBITTOKEN,                            /* token inverted index */

  TDBITQGRAM,                            /* q-gram inverted index */

};

 

TCTDB在建立列索引时,可设置索引类型,主要包括字典串序索引,十进制串序索引,TOKEN索引,q-gram索引。如果需要对某个列进行建立索引,则每当插入一个新的行时,会对相应的列添加指定的索引(每个索引对应一个TCBDB来存储索引数据)。

 

Name(主key

Age

Company

Interest

Jack

23

baidu

basketballsanguosha

Rose

22

tencent

pingpongpoker

Joe

25

taobao

kfc bicycle

 

如果需要根据Age建立索引,索引类型为TDBITDECIMAL

则当三个行插入后,生成的索引(TCBDB)中包含三行,依次为22rose),23jack),25joe)(索引会根据类型进行排序,括号中代表value)。

 

如果还需要对Company建立索引,类型为TDBITDECIMAL,则当插入三行后,生成的索引中三行依次为,baidujack),taobaojoe),tencentrose)。

 

如果还需要对interest建立索引,类型为TDBITTOKEN,则当插入三行后,生成的索引中依次为,basketballjack),bicyclejoe),kfcjoe),pingpongrose),pokerrose),sanguoshajack)。

 

有了以上索引,则当需要根据某个colomn的值进行查询时,效率会相当高,其基于btree进行查找。

 

转载于:https://www.cnblogs.com/yunnotes/archive/2013/04/19/3032349.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值