上一章聊到在车联网或物联网中对数据库的需求,以及 IoTDB 的总体架构,详情请见:git
时序数据库 Apache-IoTDB 源码解析之系统架构(二)github
打一波广告,欢迎你们访问IoTDB 仓库,求一波 Star 。欢迎关注头条号:列炮缓开局,欢迎关注 OSCHINA博客sql
这一章主要想聊一聊:数据库
假如咱们的逻辑上的数据表格式及数据为:apache
时间戳 | 人名 | 体温 |
---|---|---|
1580950800 | 张三 | 36.5 |
1580950800 | 李四 | 36.9 |
1580950800 | 王五 | 36.7 |
那么他出如今硬盘格式就是:架构
在我理解上,行式数据是把逻辑相关的数据在硬盘上放到一块儿,好比上面的例子,咱们能够称之为体温表,因此在逻辑上:时间、人、体温,就成为了逻辑上紧密相关的数据。编码
因此把相关的数据的硬盘上的组织方式也变成连续的,假如我须要取 张三
的数据,那么当你读出 R1 文件块的时候,就是读出了全部 张三
相关的数据。.net
列式数据在我理解是将物理相关的数据放到一块儿,好比时间是一类(long
类型)、名字是一类(string
类型)、体温是一类(float
类型)。固然这种硬盘的组织方式,相比起行式数据库,在取拼回体温表的结构的时候,速度就慢了不少,由于你要分别取 C一、C二、C3 文件块,而后还要写个容器往里 Set()
。那么列式数据存储方式相比于行式存储优点在哪里呢?设计
有一种叫法是只读投影列,避免查询无关列的读取。列式存储的优点在于查询的列数远小于总属性数量,就能少读不少数据。可能读起来很是绕口,举个例子:好比我须要查体温大于 36 度的体温值,sql : select 体温 FROM table WHERE 体温 > 36
。这时候若是是列式存储只须要读出 C3 数据块就能够一次性查到全部数据。而行式数据库中,则须要读出 R一、 R二、 R3。在第二章中介绍到物联网中的时序数据的特色:存量数据很是大,若是遍历几百亿数据,时间差距明显就拉开了。3d
由于物理相关的数据他们类型相同,可使用多种多样的编码方式,好比 IoTDB 中就提供了 8 种编码方式,这个不具体聊,等后面章节再说。
咱们继续拿时间列举例子,咱们能够把时间列改造为差值存储: 好比 C1 文件块中先存储基础值 1580950800 那么他后面的数据值只须要存储 0 就能够,存储的数字小了,那么占用的存储空间确定也就小了,当数字特别大且差值比较小的时候,这用编码方式就很是有意义。固然还有不少好玩儿的编码方式,欢迎持续关注。
为何叫 TsFile ?我听意思应该是做为 TimeSeriresFile 的缩写,也就是时序数据文件的意思。
这是一个数据被刷入磁盘后的缩减版 TsFile 格式,咱们还拿上面的数据举例,用来直观的解释 TsFile 中出现的一些名词,假如个人数据为:
时间戳 | 人名 | 体温 | 心率 |
---|---|---|---|
1580950800 | 张三 | 36.5 | 70 |
1580950800 | 李四 | 36.9 | 80 |
1580950800 | 王五 | 36.7 | 100 |
1580950911 | 王五 | 36.6 | 90 |
上面的数据刷新到磁盘上后会对应关系以下:
看到这里应该能理解每一个英文名词的意思:
ChunkGroup 中包含多个 Chunk,Chunk 中包含多个 Page ,Page 中 包含多个 时间点和数据项
回想上面提到的 SQL : select 体温 FROM 王五 WHERE 体温 > 36
, 在 TsFile 中,只要在文件中找到 王五
的 ChunkGroup ,并在 ChunkGroup 中找到 体温
的 Chunk,而后从第一个 Page 开始遍历就完成了。
介绍完了 Chunk 和 ChunkGroup 的概念,那么若是 Chunk 和 ChunkGroup 很是多的时候,TsFile 怎么来设计才能快速的定位并找到合适的 ChunkGroup 的呢?TsFile 怎样才能作到损坏时的检测或者保证传递过程的完整性呢?欢迎持续关注。。。
有兴趣的朋友能够查看:官方 Github 中的 TsFile 文档,了解更多详细信息。