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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql 分词_使用PostgreSQL进行中文全文检索

前言PostgreSQL 被称为是“最高级的开源数据库”&#xff0c;它的数据类型非常丰富&#xff0c;用它来解决一些比较偏门的需求非常适合。前些天将 POI 点关键词查询的功能迁到了 PgSQL&#xff0c;总算对前文 空间索引 - 各数据库空间索引使用报告 有了一个交代。由于 PgSQL 国…

Android之px 与 dp, sp换算公式

px: pixels(像素). 不同设备显示效果相同&#xff0c;一般我们HVGA代表320x480像素&#xff0c;这个用的比较多。 pt: point&#xff0c;是一个标准的长度单位&#xff0c;1pt&#xff1d;1/72英寸&#xff0c;用于印刷业&#xff0c;非常简单易用&#xff1b; sp: scaled pi…

05Prism WPF 入门实战 - Navigation

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?share\sourcecopy\web本章分为以下三个部分来了解&#xff1a;Part1 视图导航、参数传递Part2 确认导航Part3 导航日志2.详细内容Part1…

常见的http状态码

400 Bad Request1、语义有误&#xff0c;当前请求无法被服务器理解。除非进行修改&#xff0c;否则客户端不应该重复提交这个请求。2、请求参数有误。401 Unauthorized当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客…

明明没PS,看起来却像PS过的32张照片

全世界只有3.14 % 的人关注了爆炸吧知识现在PS太普遍&#xff0c;以至于人们看到不同寻常的东西&#xff0c;第一时间会怀疑经过技术处理。但也有一些照片&#xff0c;真的没有PS过&#xff01;1、这些轮胎痕迹令人产生了3D的错觉&#xff1a;2、截然分开的几种景观&#xff0c…

python如何退出命令行_如何退出python命令行

命令行进入python打开cmd——>直接输入python即可直接进入PythonC:UsersAdministrator>pythonPython 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or &q…

TFS全局资源管理

在早期&#xff0c;应用要使用TFS&#xff0c;需要知道TFS名字服务器的地址才能访问TFS&#xff0c;然后调用读写接口存取文件&#xff0c;当应用比较少时&#xff0c;这种方式不会引发什么问题&#xff0c;但目前在淘宝内部&#xff0c;有200多个应用使用TFS做为后端的存储系统…

.net程序运行

contentoftable 目录数据库&#xff0c;把数据存到文件中&#xff0c;还要能有效的读出来。 保存到文件要以一定的结构。 判断数据--》保存到独立的文件夹。&#xff08;存的时候麻烦&#xff0c;读取的时候方便&#xff09; 记事本就是用控件。 应用程序要有pe头 &#xff0c;…

Android之内存溢出(Out Of Memory)的总结

图片越来越多,内存溢出已经成了不得不注意的问题了。 错误日志:11-03 12:36:54.812: ERROR/AndroidRuntime(5084): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 内存溢出主要由以下几种情况引起: 1.数据库的cursor没有关闭。 2.构造adapter没…

没有什么是日本牛郎店做不到的......

1 第一眼你看见了啥&#xff1f;▼2 确实很悲伤&#xff08;dy&#xff1a;李逍遥&#xff09;▼3 貌似真是这样▼4 我不爱打麻将咋办&#xff1f;▼5 短短十几个字&#xff0c;满满的江湖纷争▼6 少了男主的朋友不要轻易尝试▼7 哦吼▼8 双十一如你所愿&#xff0c;哈哈…

持续集成、持续交付(CI/CD)开篇,先来唠唠嗑

前言现在稍微有点规模的系统&#xff0c;很多都是采用分布式/微服务架构&#xff0c;将一个大系统拆分为很多个功能模块进行开发、测试、发布、管理等&#xff0c;如果全部流程都采用人工的形式进行的话&#xff0c;效率肯定是超级不高效滴。而且现在很多项目都采用极限编程的模…

100例经典炒菜_Python3经典100例(②)

实例6题目&#xff1a;斐波那契数列&#xff1b;分析&#xff1a;利用递归计算斐波那契数列&#xff0c;输入斐波那契数列的n位&#xff0c;调用递归计算出第n位的数列值&#xff1b;代码&#xff1a;#!/usr/bin/python3 # -*- coding: utf-8 -*- # Time : 2018-10-3 21:10 …

分享10个2012年最新发布的jQuery插件

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2012-5-9 来源&#xff1a;GBin1.com 本文收集了最新的jQuery社区发布的jQuery插件&#xff0c;绝对是你没有见过的&#xff0c;希望大家喜欢&#xff01; 1. SearchMeme 一个即时搜索的jQuery插件…

监考

中国近现代史纲要人资150230逸夫楼A2012016年1月11日周一14:00-15:50国际结算国金130430逸夫楼A2072016年1月11日周一16:20-18:10高等数学4会统专150130逸夫楼A4102016年1月12日周二14:00-15:50建筑结构与选型城规120131逸夫楼A2092016年1月12日周二16:20-18:10转载于:https://…

Android之解析XML总结(SAX、Pull、Dom三种方式)

常见的解析xml的方式有一下三种&#xff1a;SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器&#xff0c;用到了其中的两种&#xff08;sax,pull&#xff09;&#xff0c;今天对android解析xml的这三种方式进行一次总结。 今天解析的xml示例&#xff08;channels.x…

博士毕业的人也会交“智商税”?现实远比我们想象的残酷……

全世界只有3.14 % 的人关注了爆炸吧知识2018 年的那个多事之秋&#xff0c;我终于在人生快要过半的时候拿到了博士学位。大毛和小鱼是我博士期间玩得最好的兄弟&#xff0c;我们三人水平差不多&#xff0c;志向差不多&#xff0c;博士毕业后都进了双非高校。现实不像是想象中那…

UVA-1045 - The Great Wall Game(二分图最佳匹配)

题意:在一个n*n的棋盘上有n个棋子&#xff0c;要求通过移动棋子使棋子的排布满足以下情况之一&#xff1a;呈横行排列&#xff1b;呈纵行排列&#xff1b;呈对角线排列(有两条)。 棋子移动一个单元格的费用为1&#xff0c;总费用为所有棋子的移动费用之和。求最小费用。 分析:因…

聊一聊声明式接口调用与Nacos的结合使用

背景 对于公司内部的 API 接口&#xff0c;在引入注册中心之后&#xff0c;免不了会用上服务发现这个东西。现在比较流行的接口调用方式应该是基于声明式接口的调用&#xff0c;它使得开发变得更加简化和快捷。.NET 在声明式接口调用这一块&#xff0c;有 WebApiClient 和 Refi…

三次握手和四次挥手图解_三次握手和四次挥手简单理解

TCP三次握手TCP标志位TCP在其协议头中使用大量的标志位或者说1位&#xff08;bit&#xff09;布尔域来控制连接状态&#xff0c;一个包中有可以设置多个标志位。TCP是主机对主机层的传输控制协议&#xff0c;提供可靠的连接服务&#xff0c;采用三次握手确认建立一个连接&#…

分布式搜索ElasticSearch单机与服务器环境搭建

先到http://www.elasticsearch.org/download/下载最新版的elasticsearch运行包&#xff0c;本文写时最新的是0.19.1&#xff0c;作者是个很勤快的人&#xff0c;es的更新很频繁&#xff0c;bug修复得很快。下载完解开有三个包:bin是运行的脚本&#xff0c;config是设置文件&…