上一章聊到在车联网或物联网中对数据库的需求,以及 IoTDB 的整体架构,详情请见:

时序数据库 Apache-IoTDB 源码解析之系统架构(二)

打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star 。欢迎关注头条号:列炮缓开局,欢迎关注 OSCHINA博客

这一章主要想聊一聊:

  1. 行式存储、列式存储的区别
  2. TsFile 的格式

行式与列式存储的区别

假如我们的逻辑上的数据表格式及数据为:

时间戳 人名 体温
1580950800 张三 36.5
1580950800 李四 36.9
1580950800 王五 36.7

那么他出现在硬盘格式就是:

行式数据

在我理解上,行式数据是把逻辑相关的数据在硬盘上放到一起,比如上面的例子,我们可以称之为体温表,所以在逻辑上:时间、人、体温,就成为了逻辑上紧密相关的数据。

所以把相关的数据的硬盘上的组织方式也变成连续的,假如我需要取 张三 的数据,那么当你读出 R1 文件块的时候,就是读出了所有 张三 相关的数据。

列式数据

列式数据在我理解是将物理相关的数据放到一起,比如时间是一类(long 类型)、名字是一类(string 类型)、体温是一类(float 类型)。当然这种硬盘的组织方式,相比起行式数据库,在取拼回体温表的结构的时候,速度就慢了很多,因为你要分别取 C1、C2、C3 文件块,然后还要写个容器往里 Set()。那么列式数据存储方式相比于行式存储优势在哪里呢?

1.1 取数据方式

有一种叫法是只读投影列,避免查询无关列的读取。列式存储的优势在于查询的列数远小于总属性数量,就能少读很多数据。可能读起来非常绕口,举个例子:比如我需要查体温大于 36 度的体温值,sql : select 体温 FROM table WHERE 体温 > 36 。这时候如果是列式存储只需要读出 C3 数据块就可以一次性查到所有数据。而行式数据库中,则需要读出 R1、 R2、 R3。在第二章中介绍到物联网中的时序数据的特点:存量数据非常大,如果遍历几百亿数据,时间差距明显就拉开了。

1.2 数据编码和压缩

因为物理相关的数据他们类型相同,可以使用多种多样的编码方式,比如 IoTDB 中就提供了 8 种编码方式,这个不具体聊,等后面章节再说。

我们继续拿时间列举例子,我们可以把时间列改造为差值存储: 比如 C1 文件块中先存储基础值 1580950800 那么他后面的数据值只需要存储 0 就可以,存储的数字小了,那么占用的存储空间肯定也就小了,当数字特别大且差值比较小的时候,这用编码方式就非常有意义。当然还有很多好玩儿的编码方式,欢迎持续关注。

TsFile 文件格式

为什么叫 TsFile ?我听意思应该是作为 TimeSeriresFile 的缩写,也就是时序数据文件的意思。 

这是一个数据被刷入磁盘后的缩减版 TsFile 格式,我们还拿上面的数据举例,用来直观的解释 TsFile 中出现的一些名词,假如我的数据为:

时间戳 人名 体温 心率
1580950800 张三 36.5 70
1580950800 李四 36.9 80
1580950800 王五 36.7 100
1580950911 王五 36.6 90

上面的数据刷新到磁盘上后会对应关系如下: 

看到这里应该能理解每个英文名词的意思:

  1. ChunkGroup 代表了设备(逻辑概念上的一个集合),在 IoTDB 中称为 Device。
  2. Chunk 代表了测点数据(逻辑概念上的某一类数据的集合,如体温数据),在 IoTDB 中称为 Measurement。
  3. Page 中存储的是具体数据,包含一个时间序列、一个值序列。
  4. PageStatistics 是保存的是Page当中数据的预聚合信息。
  5. ChunkStatistics 是保存的是Chunk当中数据的预聚合信息。

ChunkGroup 中包含多个 Chunk,Chunk 中包含多个 Page ,Page 中 包含多个 时间点和数据项

回想上面提到的 SQL : select 体温 FROM 王五 WHERE 体温 > 36 , 在 TsFile 中,只要在文件中找到 王五 的 ChunkGroup ,并在 ChunkGroup 中找到 体温 的 Chunk,然后从第一个 Page 开始遍历就完成了。

介绍完了 Chunk 和 ChunkGroup 的概念,那么如果 Chunk 和 ChunkGroup 非常多的时候,TsFile 怎么来设计才能快速的定位并找到合适的 ChunkGroup 的呢?TsFile 怎样才能做到损坏时的检测或者保证传递过程的完整性呢?欢迎持续关注。。。

有兴趣的朋友可以查看:官方 Github 中的 TsFile 文档,了解更多详细信息。

时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)的更多相关文章

  1. Ocelot简易教程(七)之配置文件数据库存储插件源码解析

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...

  2. TiKV 源码解析系列文章(三)Prometheus(上)

    本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...

  3. Java源码解析——集合框架(三)——Vector

    Vector源码解析 首先说一下Vector和ArrayList的区别: (1) Vector的所有方法都是有synchronized关键字的,即每一个方法都是同步的,所以在使用起来效率会非常低,但是 ...

  4. Spring源码解析之BeanFactoryPostProcessor(三)

    在上一章中笔者介绍了refresh()的<1>处是如何获取beanFactory对象,下面我们要来学习refresh()方法的<2>处是如何调用invokeBeanFactor ...

  5. Spring源码解析之ConfigurationClassPostProcessor(三)

    在上一章笔者介绍了ConfigurationClassParser.doProcessConfigurationClass(...)方法,在这个方法里调用了processImports(...)方法处 ...

  6. java源码解析之String类(三)

    上一节我们主要讲了String类的一些不是很常用的方法,其中需要掌握的如下,我就不再赘述了 public int length() public boolean isEmpty() public by ...

  7. 时序数据库 Apache-IoTDB 源码解析之文件数据块(四)

    上一章聊到行式存储.列式存储的基本概念,并介绍了 TsFile 是如何存储数据以及基本概念.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件格式简介(三) 打一波广告,欢迎大家访问Io ...

  8. Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

    Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的?   如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...

  9. [源码解析] 从TimeoutException看Flink的心跳机制

    [源码解析] 从TimeoutException看Flink的心跳机制 目录 [源码解析] 从TimeoutException看Flink的心跳机制 0x00 摘要 0x01 缘由 0x02 背景概念 ...

随机推荐

  1. 【题解】CF986E Prince's Problem(树上差分+数论性质)

    [题解]CF986E Prince's Problem(树上差分+数论性质) 题目大意: 给定你一棵树,有点权\(val_i\le 10^7\).现在有\(m\)组询问给定参数\(x,y,w\)问你对 ...

  2. $Noip2018/Luogu5021$ 赛道修建 二分+树形

    $Luogu$ $Sol$ 一直以为是每个点只能经过一次没想到居然是每条边只能经过一次$....$ 首先其实这题$55$分的部分分真的很好写啊,分别是链,数的直径和菊花图,这里就不详细说了. 使得修建 ...

  3. Java容器知识总结

    剖析面试最常见问题之Java集合框架 说说List,Set,Map三者的区别? List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一 ...

  4. 「SP25784」BUBBLESORT - Bubble Sort 解题报告

    SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...

  5. 力扣208——实现 Trie (前缀树)

    这道题主要是构造前缀树节点的数据结构,帮助解答问题. 原题 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = ...

  6. Tomcat黑窗口中对于中文乱码问题的解决

    存在的问题: 如标题,下图所示,启动tomcat时黑窗口中中文乱码,影响查看程序打印信息 解决方案: tomcat安装/解压目录中,conf 文件夹下 logging.properties 文件中,代 ...

  7. Ant Design 表单中getFieldDecorator、getFieldValue、setFieldValue用法

    Ant Design 表单中getFieldDecorator.getFieldValue.setFieldValue用法 一.getFieldDecorator getFieldDecorator是 ...

  8. 前端页面表格排序 jQuery Table 基础

    通常来说, 排序的方式有两种, 一种是我们在查询的时候就排好序,然后将数据渲染到前台页面上, 但是这样做有个弊端,就是在争对做好了缓存处理的系统, 在查询相同数据的时候进行排序,可能不能成功, 因为进 ...

  9. GitHub项目绑定自己的域名

    github博客搭建:https://blog.csdn.net/walkerhau/article/details/77394659?utm_source=debugrun&utm_medi ...

  10. centos7 安装jdk8和maven3

    centos7 安装jdk8和maven3 标签(空格分隔): java,linux jdk 第一种安装: yum install java-1.8.0-openjdk /usr/lib/jvm/ 默 ...