00:00
那我们再来说一说,呃,Roll up的另外一种使用场景啊,用法都一样啊,它的意义不一样,就我们的明细模型中也可以用roll up,但是呢,我们说roll up一般是在多维分析里面获得更粗力度的聚合结果,那明细模型又不聚合,那它有什么用呢?哎,这个东西就跟效率有关系,有一个东西叫前缀索引。对吧?那我先挨个看啊,在明细模型的roll up已经失去了上卷这种更粗力度聚合的这个含义所在,呃,它最重要的目的是什么?调整列顺序以命中前缀索引啊,这个是它在这里的意义啊,记住这几个词啊,调整列顺序,命中前缀索引。那我们先了解一下什么叫前缀索引,那么大家要注意啊,Doris不支持在任意列上创建索引啊。它是不支持的啊,不像MYQ啊,你想怎么签就怎么签啊,因为Doris。
01:04
这种大规模并行处理的op数据库,主要关注的是并发,还有对大数据量的支撑,那么它底层呢?我们简单了解一下,它数据存储的底层是这种。有序字符串表,就ss table这种数据结构,这种结构,呃,就算你不了解,你要知道它是一个什么有序的。这也是为什么我们说明细模型还指定那个key干什么,指定那个key,它会底层会按照它进行排序嘛,啊其实就跟这个有关系啊,会指定的列进行排序,那如果我们以排序列作为条件查找就会比较高效,当然这个不是前对索引的问题啊。那我们前面提到各种模型,我们都要指定一个key的描述信息,对不对,那其实就他们其中一个最重要的作用就是指定一个排序列啊,另外一个前缀索引,在排序基础上实现了一种根据给定的前缀列快速查找数据的首选方式。
02:13
什么意思,他不会,你比如说指定了多个列,我们下面来看。他会将一行数据的前36个字节作为这一行数据的前缀索引。遇到ver差类型时会截断,比如说下面有这么一张表,呃字符,呃字段的顺序是从上到下,那你看big in。是八字节。Age。是一个int类型,是不是四字节对吧,然后一个V叉。我差100,它是可变长度的,对不对,那它不会一直取到100对吧,可能加起来取到36。啊,就完事了啊,它会截断啊,截断看到vertu截断,因为它是变长的嘛,啊它就组成了什么样一个索引呢?比如说U了ID,它就变成这样U了ID啊,然后拼接上edge,拼接上啊这个message字段的一部分,这样就形成了一个索引,这个东西有点像什么呢?如果你了解h base。
03:19
是不是有有有些像rookie啊,我们在rookie设计时,是不是有时候会把字段啊拼接起来当成一个rookie,方便我们去扫描,对不对,一样的道理,那这个前缀索引。是为了方便我们去命中和查找的,那下面我们再看看,这里是讲那个截断的例子啊。呃,比如说这个英文班差20。对吧,它最大长度就20,那么说遇到ver差就要截断啊,另外一个条件达到36个字节,但是虽然没到36,但遇到ver差就截断了,也就是他只保留了一个U内这么一个前缀索引。好了,废话说这么多,我们聊点关键的,前缀索引最大的作用,当我们的查询条件是前缀索引的前缀时,相当于说就命中了这个,呃,就索引就生效了,就加快查询速度。
04:17
对不对。就比如说我们按第一个例子来讲啊,这个例子来讲。我们执行这么一个查询啊,是不是过滤条件里面有U了,ID还有age这两个是不?你看前缀索引是什么样呢?啊,我还是在这写一下这个U了。Ad拼接上,Age拼接上,呃,Message的一部分,这个是不是构成了一个前缀索引?那如果我们的过滤条件是按照这个顺序,也就是说U的ID在有,Age也有,就从左到右的顺序,那就能命中这个索引的前缀是不是?那这样的话我们的查询效率就高了。那如果你写的是另一个age等于20,那你想想能命中前缀吗?它的前缀是什么?是U的ID。
05:13
我们过滤条件只有age,不好意思前对手也没有命中啊,那这个时候查询效率就会比刚才这种啊,用了ID也过滤,Age也过滤的方式要慢得多得多,对吧。那你也那,但是我们也不能为了命中前缀索引就强行说我要过滤这个用户ID了。是不是因为我这个需求,我就是不要过滤,不要过滤它,那怎么办呢?这个时候我们就roll up闪亮登场。前缀索引既然是按照key的顺序拼接起来的一个前缀索引,那么。实际需求又没法按照这个字段顺序去过滤的话,可以用roll up。来调整什么,调整前缀摄影,这就是roll up的作用啊,因为见表时我们指定列顺序。
06:06
列顺序一定前缀索引是不是也就定了啊,前面讲过啊,按照顺序,然后36个字节啊。那roll up怎么调整呢?你看原先的表示这样顺序是从上到下,那就是UID再拼接edge,再拼接message一部分,对吧,这是一个前缀索引那一样的,我过查询需求不需要用户ID,不用过滤。我就想先查age,就只想过滤age,那这时候怎么办?创建roll up表就OK了嘛。Roll up表还记得我们前面怎么用的吗?来,我们创建roll out表,是不是out table at roll up,然后呢,起个名字,这里面是不是有一个字段顺序?对吧,我们只需要在这个括号里面顺序调整一下就行来。
07:01
我们只需要roll up表,把这些字段都写进去,但是顺序调一下,是不是他俩对调了,把age写到前面。对吧,那这个时候roll up表跟base表就完全一样,只是将因为idh顺序换了。那我们当我们执行。Age等于20,你看我不查UID了,对吧?原先UID是前缀啊,现在不是了,我调整了roll up满足对吧。然后今天再给你一个message,那这个时候,呃,我们查的时候会走周二和表。因为它跟前缀索引匹配度更高啊。相当于说基表有自己的前缀索引,我们roll up表也有roll up表的前缀索引,对吧,那你能。这条查询语句跟谁更快他就跟谁走啊,对吧,谁有钱跟谁走是吧,一回事,那这个咱们不去演示了啊,这没什么好演示,因为这个都是底层的一个匹配过程啊,就说一下这个用法,说了这么多,说白了就一个事儿,Roll up可以调整明细模型的这个。
08:13
列的顺序,从而满足我们啊的查询,当不能满足前缀索引的时候啊,去调整一下顺序啊,强行命中一个新的roll up表的前缀摄影,好,这是它的意义所在,好吧。
我来说两句