00:00
好,那么接下来我们聊聊一个二级索引,那么二级索引又称为跳数索引啊,跳数索引,那它其实说白了就是一级索引不好用呗,然后在又设计了一个二级索引,那么有一个注意事项是在老版本也就是20.1.2.4之前,这个二级索引还是一个实验性的功能,需要呢,打开一个参数,但是咱们目前版本是比较新的对吧?呃,这个版本应该是在2020年一月份发布的啊。其实。大家看这个前缀,应该能猜出它的版本号的意思呗,前面两个是啥?二零年依旧是一月啊。那我们看一看那个。新版的话这个是三,呃,没有这个配置啊,那我们可以先看一看这个参数,我搜一下在官网里边,嗯。直接啊,这是已经搜好了,我重新搜,你看右上角把这个参数输入进去,然后有一篇文章啊。
01:07
打开。这是哪个版本呢?20.1.2.4,并且月份呢,2020年1月啊,那这个东西呢,我们瞅一瞅啊,那个参数在哪呢?我搜一下诶就是这个。你看它的意思是什么?跳数索引的功能,默认情况下,这个跳数索引的参数已经在生产中启用了,也就是默认是开启的,那么现在这些设置呢,是已经过时了,没有任何作用啊,如果你不进的,嗯,那我同时我们也可以验证啊,我set这个参数试一下,在咱们的版本里面,他直接就报错了。叫什么?未知的一个设置,对吧,这个设置已经被删除了,所以这个大家要知道啊,这个要知道,那么再往后呢,咱们看看,咱们来看看这个二级索引怎么用啊,首先从用法上来讲,你只需要在建表语句,在字段定义的时候加一一段就行了。
02:15
嗯,那这边呢,什么意思呢。索引A对吧,这来我们拆分一下它的语法。来,首先第一个要指定的是什么呢?加索引的一个字段。然后呢,我命名叫A对吧,然后是哪个字段呢?Total amount,另外它的二级索引的类型分为很多种,有四种吧,我记得一会咱们呃,就不展开聊了啊,那最常用的是一个mmax,就其实就记录一个最小最大值对吧?咱们跳数不是呃隔隔一段取一个,隔一段取一个吗?那它记只记录这一段里面的最小跟最大,那后面这个是什么力度。
03:06
五对吧,这是第三个要指定的东西叫力度。啊,力度,那这个力度的意思就是什么意思呢?区别于咱们前面的稀疏索引的一个那个那个那个那个叫什么,所以力度那个是8192啊。那这个是啥意思呢?前面这两个不用解释了啊。那主要是这个值的意思,我举个例子。呃,这边我们画一个,呃,比如说咱们的数据是从零到很多很多对吧,比如说到。1亿或者怎么样无所谓了,那你想咱们最开始记录了一个什么?啊,比如说零到8192对吧。就这一段呢。第一段是不是零到八啊,或者咱们简单一点就不要记这个数了啊,就零到一可以吧,零到三我三个,我把8192简化成三好吧。
04:02
那第二段他是不是在这里又挑一个数记一下,那这一块确定的范围是多少。是不是三到六啊,我举个例子,比如比如说很均匀对吧,那最后一段又记录一个是不是一个六到九啊。对吧,那如果咱们刚才二级索引不是有个叫力度嘛,对吧,什么什么指定为五,那我这边改成三就好了啊,改成三那他什么意思呢?在你一级索引的基础上,我再记录一次,我这边记录一个什么三,表示把现在是不是分成这里是不是已经有三块了,它每三块再聚合一次,那这三块汇总起来是不是零到九啊。能理解这意思吗?对吧,就在你分块的基础上,我再分块,我再呃重新汇总一次,这就是一个二级索引,那二级索引有什么意义啊,你前面都已经有系数索引这么来记录了,有什么意义,它的作用主要在这儿,同学们。
05:03
你想想,如果我数据大量重复了。好。那你来记录,比如说这一行你记录了一下,这一行记录了一下,这一行记录了一下。你现在要找二。或者说你你你你找二的话。有序的,你肯定知道在这一段对吧。那比如说你找个一呗,找个一好,那你找谁呀。是在这一段呢,还是在这一段呢,是不好找啊,那这种时候怎么办呢?其实也简单啊,呃,我们可以怎么样把它再汇总一次,一到三。他是不是肯定在这个范围里面。能理解吧,呃,当然这个例子可能不太形象啊,我想想,呃,其实刚才那个也行啊。
06:02
二级索引的目的,你看比如全是一啊,然后234567,假设中间有N个一啊。那你想想,原来你记录的是什么?一,比如说这中间有1万个一,你是不是一到一啊。对吧,然后下一个你再跳一个,又是一到一再跳一个,比如说是一到十,再跳一个,比如说是十到,呃8000多行,比如说十到1万。举个例子啊,就咱们这是第一级索引对吧,也就是咱们primary key那个索引,那这个时候你想想,你要找一个数据,比如说是呃。找多少呢?找15。这个值要找15的值所在的行,那你想想你是不是得先跟这个判断一下,哎,判断说哎,我比你大,然后你是判断下一个说哎,我又比你大,再判断下一个我又比你大是吧,你是不是得判断三次啊,那二级索引的作用在哪里呢?我们说了,比如说那个二级索引的力度我指定为三。
07:11
那他什么呢?其实就是力度变得更粗了一点呗,V3是什么意思啊,我每三个区间合并一次,那这边记录就是一到十呗,对吧,那后面可能是十到啊,比如说2万,因为后面还有嘛,我省略了嘛,点点点点好吧,那你想想你你要找15的时候,你是不是判断一次这个就行了,再判断下一次这个。去判断两次就OK了。是吧,你只需要判断两次,那如果你只有一级索引,你你可能因为重复的数据多,那你做的索引可能都撞上了,那这个时候你要判断多次,效率是不是就低了呀,对吧?这个就是咱们二级索引的一个作用啊,所以大家也要理解这个。后面这个力度什么意思啊,这个就是二级索引对于一级索引力度的力度,说白了你把一级索引分成一块一块的,二级索引就是每次我能跳几块对吧,每次跳几块,每次跳几块这意思啊。
08:12
那如果不好理解,大家再慢慢去思考思考吧,啊这一块因为索引这个事儿还是比较麻烦的啊,就就咱们这个例子应该也够直接了,那。我们来试试呗。来这里我建一张表啊。填完表之后我往里插数据啊。差好这些咱们都单就行了啊,你这个表明是加个二对吧,后缀,那对比效果咱们是通过这种方式来跑的,还记得咱们介绍的客户端是不是可以杠杠query啊。对吧,可以刚刚corry,那其实你看我就把一个circlel语句写在这里,这是一个circle,然后呢,我又指定了客户端的日志为trace。
09:00
你不指定也行,但是你要跑一遍circle,然后呢,你到呃,Click house server的路径下去看一个log。其实我加这个参数的意思就是我在客户端直接打印出来,就省得自己去翻日志的呗,就这个意思啊,那我们把这个语句拿出来啊,你看看我们过滤条件是不是有一个total amount。对吧,Total amount啊。我们加了二级索引的字段啊,来我们。嗯,那我应该在外面执行对吧,对,嗯,好。这个就没必要在交互式客户端执行了啊,回车你看这日志是不是都打出来,有什么debug级别,有trace级别,还有info级别,这个其实在我们服务当中就是有的,好,这不是咱们关注的啊,咱们找一个地方。啊,我缩小一点。嗯,我看看。诶。眼睛都看花了。他这个。
10:03
找一找啊,找一找。我记得是在这个的哦,这里这里你看它是不是debug信息打印的。对吧,你看这就是他详细执行过程了,有一个什么索引AA,就是咱们起的别名,已经被删掉了什么什么。1/2的是吗?力度呗,这至少你可能不理解他干了什么事,对吧?但他我们知道这个索引二级索引是生效的啊,当然你也只有数据量大,并且有大量重复稀疏索引不明显的时候,你加了它才有效果,呃,那这个A是从哪来的?还记得咱们的建表语句吗?咱们建表语句指定的这个二级索引是不是起名叫什么A对吧?行,另外呢,咱们看一个地方啊,看这个数据路径。
11:05
啊,PWD是vrd click house data defa这个库下面对吧,我们看看现在是不是有三张表,这张是新建的,有二级索引的t order ntr,呃,进来之后。还是一样的,对吧,我们随便进入一个分区打开,你看多了一个什么。跳数索引。对吧,所以你你想判断这张表有没有加索引呢,你到他的路径下面一瞅就知道了,或者你是不是可以看他的原数据啊。对吧,是不是在Meta德塔那个目录下面Meta data。那同时你还可以怎么看呢?是不是可以show create table,然后加表明是吧,就可以了。这是一个跳出索引啊。
我来说两句