00:00
好了同学们,那咱们接下来给大家讲一下咱们这个king的这个优化的最后一个啊,叫做这个R优化。那我们来看一看这个优化是优化什么,我们在上边这个存储原理这一章节我们已经学过了,大家已经知道了,在这个h base里边是吧?咱们这个K里要把这个Q5存在h base h base里边,然后呢,它在这它是设计了一个ROK的ROK分为两部分,第一部分叫q boy的ID,第二部分就是咱们这个维度值,就是维度字典表里边的个映射值,这两部分组成了咱们这每一条Q补数据的柔K,那咱们这个柔K能够怎么设计啊,大家看好了啊,咱们这一块是有一个优化手段的,首先人家告诉你了啊,Kidding会把所有的维度按照这个顺序组合成一个完整的RO。并且按照这个UK它怎么着啊,它会升序排列,我qbo里边所有的行,注意它这个UKID,它排列的时候是升序排列。啊,就是越来越大,越来越大是这样的啊,那我们这个设计良好的RK,我们可以将有效的完成咱们这个数据的查询。
01:07
啊,查询过滤和这个定位,我们可以减少这个IO次数,因为大家都知道在这个h base这一块是吧,你要么干啊,要么是一个个获取,大家知道,呃,如果说你干的次数比较多,那咱们这个IO次数比较多啊,那我这那我一旦这个这个这个SKY一下子都能查出来,我就减少IO次数,我就可以提高我这个查询速度啊唯度我在这个rie的这个次序顺序,对我这个查询查询性能有显著的影响。那我们来看一下啊,咱们这个UK这一块设计的时候,它是有两个设计原则的。第一个原则啊,第一个原则就是被用作过滤的维度,我要放在前面。什么意思啊,你就比如说咱们这一块是吧,咱们这个柔呃,咱们这个qbo的111共有三呃两个维度,一个多张值,有ABC这个多长值,那现在大家看啊啊,我如果说我把这个A放前边。
02:01
那那我那那大家都知道咱们这一块是吧,是会排序的,怎么排序啊,那我这个A这一块是吧,就是一呃二然后三,然后四,然后这个B这一块就是ABCDABCD,然后ABCDABCD,它是因为它是字典排序嘛,如果呃你把这个A放在了B的前面。就是咱们这个ROK设计的这么一个顺序是吧,你把A放在了B的前面,那我将来我这个数据就变成这个样子,就是我我这个我这个数据在底层h base存储的时候,它就是以这个形式来存的。那既然哎,我这个HB里这么存的,那你将来在查的时候,大家看好了啊,那那然后我干嘛呀,我将来在查询的时候,你会发现我经常会用这个B干嘛呀,给他做过滤。我用我这个B大写这个B就这一列它干嘛呀,它大于等于B小于等于C,说白了我只要这个B跟C的数据,那这样一来说吧,如果这个数据你这么存。那你要死掉三次了,首先啊,这一块有有有有有两条,这一块有两条啊,这一块又有两条,因为咱们ABCDABCD往下排嘛,是吧,我这个123,包括下边这个四是不是得得都有两条啊,就是你要多次死干我这个表,那这个时候我们这么设计就不太好。
03:16
那因此有这么一个,有这么一个原则叫什么原则啊,就是你将来在查询的时候,你经常用来过滤的那一列那个维度你往前放有什么意思啊,咱们经常要以这个B做过滤,所以说我这个B要放在A的前边,那这样一来大家明显看到是吧,我我我因因为咱们这个q boy的排序,它还是升序排序,那我这个B放在A的前边,我就先按照B排序了,我就是A啊1234,然后B1234 C1234啊B1234。那你一旦这么排,我还是要这个B大于等于BB小于等于C,是不是只要B跟C的数据啊,那因此你会发现我这个B跟C的数据它就排在了一起了,那我在底层死干这个hpc表的时候,我只需要死干一次,我只需要扫描一次就可以了,那你扫描一次,我只有一次这个磁盘IO,那因此我就能大大的提高咱们这个查询速度。
04:09
啊,所以说咱们这种设立原则,它可以干嘛呀,它优化的是咱们这个查询速度。记住啊,它优化的是查询速度啊,就是把这个用作过滤的维度放在前边,那些不用再过滤的维度就往后放,就往后放好吧,啊,那我们除此之外呢,还有什么一个设计原则,还有一个啊,另外一个就是咱们这个基数大的维度要放在基数小的维度前面。那这样一来,我又又又是什么意思啊,就是它为什么要这么设计呢?我来看一下啊,首先第一个问题,咱们要明白一个问题啊,就比如说再给大家讲那个逐层构建的时候,大家都知道咱们这每一层构建,我是不是先创建四个维度的,要通过四个维度的,再构建三个维度的,要通过三个维度的再构建两个维度的呀。那这个时候你会发现怎么着了?你就比如说哎,咱们先得到了abcd这四个维度的一个qbo的,然后通过这四条一,我是不是得到了一个1110跟一个1101啊,我得到了一个ABC的,我还得了1ABD的啊,我还到了一个,我还得到了一个abd的是吧?1110跟101,那现在大家会发现我要我要从这三个维度。
05:17
来聚合成两个维度的了。那你会发现咱们这个1110能聚合成A跟B,然后这个1101是不是也能聚合成A和B啊,那你就比如说我这个A跟B,我应该按照谁来拿呢。如果让你手动选择,你选择谁呢?你就比如说我这个ABC聚合以后,我是六条数据,我这个abd聚合以后,我是三条数据,如果说不要这个C,也不要这个D了,我只要abd了,是不是他们将来只聚合成一条数据了,就是这个问号跟这个。呃,应该什么样,应该是我,呃呃,你去环完以后,是不是就变成力量调数据了,那那这个时候我们应该按照按照按照按照什么最好,如果他们手动挑的话,那是按照什么来调换,是不是你你要挑这个1101啊。
06:05
为什么呀,因为它这个聚合程度高,你从三条这这个聚合成一条,比这个六条聚合成一条要这个高啊,这个效率要高啊,那现在咱们手动选这个,那你会我现在我现在我就告诉你这个king它是自动选择,你这个手动没法选,那他按照什么原则来选啊,他会优先选择这个q boy的ID小的。他会优先选择这个q boy ID小的,就是咱们这个1110是吧,1101,他选的是1101,因为01:10要小,这是一,这是二啊,如果对,如果咱们比这个二进制大小的话,能理解吧,他优先选的就是这个q boy的ID小的,那你要遵循他这种机制的话,因此咱们就得到一个结论,什么结论啊,基数大的维度,你给我向前调。咱们只有保证这个基数大,什么叫基数大?就比如说我这个C是1234566个基数,我这个D是1233个基数。
07:04
那因此你这个C。要放在D的前边,因此咱们才得到了一个1110跟一个1101,那这样一来是吧,我110基数大,我1101基数小,而刚好我基数小的这个数字也小,所以说我这个K里会默认选择这个1101来做咱们这个1100的这么一个聚合。啊,就符合了他们这种机制,大家要明白啊,这一块有点绕,希望你们自己捋一捋,好吧,自己捋一捋,那现在我们要总结一下咱们这种设计原则,它优化的是什么呀?它优化的是构建速度,千万别搞混了,同学们,它这个优化的是构建速度,那上面这个优化什么呀?它优化的是circle查询速度。好吧,啊,这是关于这两两个角度的这么一个优化啊,就是UK的设计优化啊,咱们就给大家讲到这儿啊。
我来说两句