00:00
好,那么下一步呢,我们要给大家讲这个in Fla DB里面的查询,但是你要说这个数据库呢,它和我们的这个啊,以前见过的这种普通的关系性数据库呢,还很不一样啊,所以说呢,你后面想要写出正确的一个查询或者插入,那么还是有必要了解这个Fla DB它是如何去管理数据的,那么这一节呢,我们就给大家讲一下in Fla DB里面的这个数据模型,呃,需要注意的是,呃,我们这个附录四的这个题目呢,叫做时序数据库,呃,时序数据库中的这个数据模型,呃,是因为in Fla DB呢,它的这个里面数据组织的方式呢,它其实很有代表性。呃,目前呢,呃很多的这个呃时序数据库的这个呃,数据管理的一个结构呢,基本上来说呢,都有一些相似性啊,可以提供参考。好,那么我们这个文档里面呢,它其实是先给大家看一下这个普通关系型数据库里面的表,然后呢,再给大家看一下个啊in Fla DB里面它是怎么管理数据的。
01:01
好,那么接下来呢,我们可以看到啊,就是这个文档里面呢,给大家放了一个啊,我们常见的普通的关系型数据库中的表。哎,可以看到。那么在这个表里面呢,啊,我们要注意啊,这个park ID,然后client,还有这个呃,Time这三,这三个是加了索引的这个字段,这样呢,方便我们根据这个,呃,我们要查询的这个维度,比如说这个帕ID,还有planet。然后呢,还有这个时间戳啊一块呢,去查询我们想要的这个数据,那么这个photoshs呢啊,它是一个呃,数值类型的字段啊,那么这个字段呢,就是没有被加索引的,呃,现在呢。呃,我可以把它这个呃手动翻译成我们的这个呃,In DB里面的行格式。那么我们现在呢,就瞄准这个第一条数据啊,就这一条数据。我们看把它翻译成行,格式应该怎么写?
02:00
呃,首先呢。我们可以给他这个,呃,数据呢,起一个。我们的这个词量名称,比如说就叫这个photoshs。然后呢,我们说这个帕IDPLA,还有time呢,它都是加了索引的啊,那么park ID呢,是一个维度索引。这里的它就可以相当于我们的这个行协议中的标签集,那么帕ID呢就等于一,然后这个plant呢,也是一个维度索引,也算在我们标签集里面。Point等于20。啊,之后呢,我们可以看到这是一个时间,那么我们说时间呢啊,时间戳应该放在这个航线一的最最尾部啊,另外呢,就是有我们的这个photoshs,这个呢是我们没有加索引的啊,相当于我们的字段集打一个空格,然后呢这里。用这个footshs加上它的值是等于零,然后空格最后呢,诶是这个时间戳我这里呢,就不敲这个数字了,直接打一个time stamp。
03:13
好,那么这个呢,就相当于我们这个在in Fla DB里面的一个行格式,那么这一条数据呢,实际上会在这个in Fla DB,那它被这个in Fla DB识别到,然后写到这个数据库中啊,他会怎么样去存储呢?啊,我们可以看一下下面的啊,就是in DB里面的一个存储方式。呃,我们可以看到在普通的关系型数据库里面呢,这些数据实际上是按照按行的方式去存储,那么在一发DB里面呢,它会有一个新的概念叫做序列。我们可以看到啊,就是我这里呢,这个测量的名称就是measurement,叫做foot ships,那么这里的name就是foot ships,然后标签集,它这有个T啊,其实text set t,那么这里呢,有多个标签啊,标签呢是键值对的方式来放的啊,其实就是我们的park ID等于一和plant等于earth,然后呢,这个时间戳呢,可以看到啊,就这个地方,这是文件的一个头,然后这里呢,有一个字段叫time,然后这边呢有一个字段叫做footshs,然后这个时间戳啊,它放在左侧,那么这个时间戳格式呢,我们后面会给大家介绍啊,是为什么是这个,这个写法什么意思,然后后面呢,右边这个就是我们的刚才的这个字段的值,呃,那么你会发现呢,这样存放它和这样存放和这个关系型数据库中的这个存放方式有什么区别呢?我们会发现啊。
04:37
其实在英DB里面。你会发现我们把唯一啊,同样的这个唯一的一个组合,也就是呃,测量名称标签集和这个字段的K,它组成的一个唯一的组合的数据密集的放在了一起。这样的一个好处呢,就是如果我知道这个measurement。
05:01
然后呢,我在查询的时候指定了这个measurement啊,也指定了标签集,那么我可以快速的将这些数据的一个啊集合这一批数据我可以一次性查出来。那么时间戳上呢,又打了索引,那么我就可以呢,快速的按照时间戳呢进行一个过滤,那么如果是我们的普通的关系型数据库呢,实际上这个所以呢设计就要非常考究了啊,因为这个查询呢,如果写不好的话啊,因为这个呃普通关系数据库里面,它其实是按行去维护我们的这个呃数据的,那么我当我需要查询的时候,就很有可能是会触发多次寻址,也就是说啊,我要查这个park ID,然后light等于earth park ID等于一和这个时间戳在哪个范围里面的,它可能会导致这个关系型数据库。啊,怎么运行呢。哎,它可能会导致我要先找出来这条数据,然后再找出来这条数据,再找出来这条数据,最后呢,把这条数据找出来。
06:05
那么这样一来呢,我们的这个查询的效率就会变慢,另外像这个in发TB里面存储数据的方式呢,其实还可以让这个数据的体积更加的小,呃,我们可以看到其实在这个关系型数据库里面,它是按行来管理数据,呃,那么park ID呢,作为一个维度索引,其实我们可以看到它是会有重复的,比如说这里就重复了四次,那么plant等于earth呢,这个地方也重复了四次,但是在我们的这个in Fla DB里面呢,啊,你作为一个维度索引是吧,只在这个图号就可以了,在标签机里面出现一次就可以了。呃,所以说我们行协议的时候呢,每一行数据里面会有一条,但是在in Fla DB里面被解析完之后啊,存储到if s TB里面之后呢,它其实只占一个啊,所以说这样的这个数据的体积更加小,而且更加的方便我们进行压缩。那么我们再往下看一下这个整张表啊,到这个英Fla DB里面存储的方式,呃,你可以看到,因为这个标签级这个park ID它变了,呃,这个这不仅是park ID变了,这个plant也变了。
07:08
啊,那么对于不同的这个标签的组合呢。这个在我们的Fla DB里面都会把它进行分开存放,那么这个分开存放。像这个分开之后呢。这一个新的单位叫什么呢?这一组叫什么呢?哎,这个就是我们说的序列。嗯,那么你要想写出正确的查询呢?理解序列的概念就非常重要,也就是in Fla DB,它并不是按行去组织数据的,它是按照序列时间、序列数据库,按照序列的方式去组织数据的。那么现在呢,假如说我要插入一个新的数据啊,又进来一条插在这个位置。那么新进来的这个数据叫什么呢?新进来的这个数据其实叫做数据点。
08:02
啊叫做point,叫做数据点,那么在这个里面呢,我们可以看到啊,我们的measurement啊测量名称,再加这个标签集,再加这个字段的名称。这三个东西在一块啊,约束成为一个序列,呃,那么当我们按照维度进行查询的时候,比如说我现在要查park ID等于一,然后plant等于earth。那么呢,就可以快速得到我的整个序列,呃,那么我如果要按照时间过滤呢,比如说我就想查询呃,最近的三条数据,我不想查询这个啊,三周之前三条数据之前的了,我又要查这个啊,12.01秒的这个数据。那么当我指定这个时间范围的时候呢,其实就是在序列上去对这个数据点做一个筛选,哎,所以说这其实是一个双重索引的设计,一边是我们的维度索引帮我们定位整个序列,另外一边呢,还有时间索引帮我们过滤数据范围。
09:08
那么我想大家可能看下面的图呢,会更好理解一些,那么这个图呢,是我自己画的,呃,首先呢,可以看到我们有一个这个measurement。然后呢,在measure什么的下面,TAG1TAG2,他们共同共同组成我们的标签集,然后每个标签呢,有不同的取值,另外呢,就是我们整个里面还有两个字段,就FILE1和FILE2。呃,那么现在呢,就是大家关注我们的measurement。然后标签级的不同取值它们的组合啊,就是我圈起来这个地方。再加上我们的字段名称。这三个东西联合在一起。共同定义了一个序列啊,这个绿色的线,这个叫序列。然后序列里面的各个数据点,他们按照时间戳的升序排列。
10:06
那么可以看到我这里面因为tag的变化啊,因为标签集的变化,它组成了不同的序列,那么这里面呢,一共帮我们定义了六条序列,那么我说正常的查询思路应该是什么呢?啊,正常的查询思路是这样。首先我们呢,应该先去指定这个时间的范围,也就是上来呢,先根据这个时间的范围。哎,做一个过滤。之后呢,我们再去根据我们的这个。测量名称还有标签集,哎,指定查询的维度啊,最后呢,我再说我想查这个FIELD2。指定的指定好这条序列,那么这样一来呢,呃,我从这个这个查询呢,将在这个整个六个序列这个数据里面查询出来这一条序列。
11:01
里面的这些数据点。那么这就是我们在时序数据库里面的一个查询思路。那么我如果说啊。没有说这个指定这个F2啊,或者说我指我查询的时候呢,只指定这个TAG1等于hello啊,那么会怎么样呢?其实在这个实习数据库里面呢,呃,我们支持你一次性的查询多条序列,像这个样子。那么现在这个图里的场景呢?哎,就是我指定了一个数据范围,我指定了一个我指定了一个时间范围。呃,然后呢,我查询的时候呢,诶只指定这个TAG1为海。哎,那么我们这个查询真正执行的时候啊,真正执行的时候会在我提交一条这个查询语句,然后呢,数据库会给我返回过来四条序列啊,我现在图里面标亮的这四条。然后呢,你可以在这个四条序列基础之上去应用各种查询函数,比如开窗呀,或者说是统计sum啊,中位数啊,平均值什么的。
12:05
呃,然后后面呢,我们还有一个问题就是告诉大家啊,是这个时序时序数据库里面呢,啊,一个通病叫做时间线膨胀高基数问题。就是当你的这个数据库里面呢,就整个数据库里面,当你的这个序列数过多的时候,实际上会带来一个啊性能问题。一旦序列数开始变多,那么这个时候呢,你的这个整个数据库的呃,写入和查询速度,它都会有一个呃基本上是断崖式的下降,所以说呢,我们平时把这个标签呢,你看这个最影响这个呃序列数量呢,其实就是标签啊,搞咱们的标签集,所以说标签集呢,一定要用在这种值,可与枚举啊,可以有限的,比如说是这个啊,你的工厂的编号是吧,你可能一共就100个厂子啊,那么这种的呃字段上去。啊,不要用在一种连续性啊,比如数字可以无限变化那种啊,它会导致你的这个整个序列的快速膨胀啊,这个时候呢,啊,我们的这个in DB里面呢,会有一个设置,就它不允许你单个的这个标签呢,它的值超过10万种取值,呃,当然这个你在这个in class DB里面可以调设置,把这个限制呢给它解开,嗯,但是呢,呃,为了性能考虑的话呢,不要解开这个设置啊,那么这一节内容呢,呃,可以理解的同学就可以开始学习我们后面的这个呃英SDB的查询了。
我来说两句