00:00
接下来看一下几个参数的说明啊,那。多数情况下,我们只需要调整这个运行时过滤的类型就可以了,就像我们刚才一样去set了一下默认它是一个什么呢?默认使用的是in,那也可以对多种同时设置,那它一共有这么几种类型,一种是布隆过滤啊,就使用了布隆过滤器啊,另外一个是in,还有一个是最大最小值。那这个我们前面演示的是什么,就三者同时使用对吧,但其实它也可以通过数字进行设置。那部只有在部分情况下同时使用啊,这三种,也就是说像我们刚才一样,三个同时指定啊,都用那性能会更高啊,但也不一定,那正常来讲不需要啊,那我们来呃。这个数字设置给大家看一下吧,啊,比如说我set那个参数叫什么,来我们再设一遍。
01:00
这这个对吧。比如说我只设成一个布隆过滤,对吧,然后我受variables like,呃,这个叫什么type啊,我们可以看到现在是不是就变成了不容过滤啊,对吧?那我们刚才也讲了,是不是可以有组合,比如说我只要这两个的组合,布隆过滤跟in啊,我只要同时用这两种可以吗?可以我们再受一下。是不是两者同时生效,那这种我们是直接指定名称的方式啊,必须加双引号啊,多个之间用逗号隔开,那也可以用数字来,我把这个去掉,我写一个数字一啊回车,大家可以看到是成功的,对吧,我们再受一下。一对应的是什么?印对吧,一就是印,那二是什么呢?你可以自己再玩一玩,这种就是方便我们去敲,二就是不能过滤啊,那如果三呢。
02:07
三其实是什么?不是最大最小值,而是什么?布隆跟印的组合啊,布隆跟印的组合,那四呢?四应该就是。最大最小值,那同样的道理是不是还有五啊,五的话我们再看一眼,五的话是应跟最大最小值的组合。那同样六六应该也是一种组合啊。什么组合呢?布隆跟那最大最小的组合,那七呢,七就是三个的,三个都有的组合,对吧。那有没有八呢啊,没有了啊,没有八了啊,有没有九呢?没有了,你再怎么组合也只能组组到一到七对不对。好,那这个是它的设置方式啊,一般我们讲的设这个type就可以了,好,那我们具体看,那具体每个给大家聊一聊啊,首先用布隆它是什么呢?这个其实就是用到一个布隆过滤器里面是不是涉及到哈希函数啊啊几次哈希调用几次哈希函数,然后去匹配对吧?不容过滤呢,在这里我们不展开,因为在很多地方都有应用,是一个基础知识,那么大家如果不了解,可以去随便网上找一个资料了解一下它的原理啊,那使用它要注意布隆本身有一定的误判率。
03:28
但它可能会导致过滤数据比预期少一点,但不会导致最终结果不准确,因为毕竟只是一个什么过滤,大不了就是没过滤掉嘛,没过滤掉是不是,比如说我本身有一呃100万条,我要过滤其中50条出去,那是不是剩50万条啊,那可能不能过滤,呃过滤掉了,没有过滤掉50条,他可能只过滤掉了48万条,那我是不是还剩多少,剩52万条对吧,无非就是没有提前过滤掉那么多而已啊,所以对最终结果呢,也还好,不会导致结果不准啊。
04:03
另外要注意使用布隆呢,布隆啊在部分情况下会性能降低,第一个过滤率较低的时候,或者左表数据量较小,什么意思?波表A托用BA就是左表。那如果呢,过滤率较低什么意思?我A的数据有一呃100万条,但是我只需要过滤多少条啊,本身就是从实际出发,你只需要过滤掉100条,那这个过滤率就是100除以100万万分之一,这种就表示过滤率很低啊。对吧,这个应该好理解,那数据量或者是左表数据量比较小,本身左表就1万条。或者说就1000条。那你还用布隆就没有意义啊,性能可能反而没有那么好啊。所以布隆适合在呃大表的时候会更好一点啊。另外一个要注意,只有左表的替列。才能够下推到存储引擎。也就是说我的过滤条件。
05:03
过滤的字段必须是什么气列对于左表来讲才能下推到存储引擎。什么叫下推存储引擎呢?看上面原理图。啊,其实我们数据啊,读取是不是分两步啊,那第一步这里就是下推到存储引擎对吧,也就是说如果不下推就变成这个样子,第一步它还是要全量去读,读完之后再过滤,那这样效率就没那么高了啊相对来讲。啊,这是第二个事儿啊,不下推肯定是性能降低嘛,啊,那第三一个呃。使用表达式。呃,有就是说有个限制是什么?当用布隆的时候,假阳性率过高,这个是关于布隆的,它的有的一个名词,对吧?什么叫假阳性啊,假阳性的意思就是说实际是假,但误判为真,简单理解是不是误判率高啊,你这么理解就行了啊,粗糙来理解,当误判率比较高的时候,我们就不要再用布隆了,这个很显然对吧。
06:07
呃,当它下推到存储引擎后,没有这种,刚才像这种短路逻辑啊,短路逻辑会造成这个假阳性率过高嘛,对吧,那。当过滤率较低时,可能导致性能降低啊,说白了,说了这么多干干什么?使用布隆并不是适用于所有场景,有些场景会导致什么性能降低,这个是大家要注意,所以你不要上来说啊,不管三七二十一,我全部都设成不能过滤啊,不一定啊,不一定。好,第二个看最大最小值,最大最小值的过滤,我就像我刚才讲的,比如说A表呢,ID是一到1万。那B表呢是呃456。呃,然后呢,我先扫描B表得到最小值四和最大值六,那我A表怎么过滤呢?是不是只要过滤出小于四的跟大于六的都过滤掉都不要那就行了呀,对吧?过滤条件就是一个最大值,最小值好,那么。
07:07
呃,它跟我们join子句里面关联条件系列的类型和左右表的数据分布有关,也就我on。字段等于字段,这个字段的类型还有左右表数据分布有关啊。当大家注意,当我关联字段为in big in的double时。极端情况下,如果左右表的最大、最小值相同,则没有效果。对吧,因为你这样就没有意义了,比如说A表它ID就是一到十,B表的ID也是一到十,你拿出一个过滤条件,最小值一,通过B表过滤出最小值一最大值时,那么对A表它本来就全部在这个范围,是不是相当于说就没效果了。对不对,这个就是区间的影响啊,就看有没有包含与被包含的关系,如果右表的最大值小于左表的最小值,什么情况呢?A是左表,B左右表,右表的最大值,比如说它是345。
08:11
ID嘛,比如说字段叫ID,然后左表的ID范围是什么呢?比如说是八到1万,那你看B表拿到的最大值是五。那最终A过滤的时候是不是小于最小值三啊,最小值三对吧,大于最大值五有意义吗?是不是也没有意义啊,啊这种就是要表达的意思啊。反之也一样,对吧?啊,这就是所谓的极端情况,就最大最小值,实际上没有什么过滤价值这种场景啊,这个大家要注意,一般情况下还比较少见啊,另外一个如果关联字段它微波差变成字符串的时候。可能会导致性能降低啊,这个是我们要记住的啊,如果是VI。性能会降低。因为最大最小值你分差你这怎么怎么去比较呢,不好比较对吧,性能不好。
09:05
这是最大最小值啊,其实啊,要记住了,就这两点啊,特殊情况呃,第三一个是用in的方式,也是默认的方式啊,你不去改它就是印啊,那它会构建一个范围硬的过滤条件啊。它相比布隆啊,你看开销更低。呃,右表数据量较少时性能更高啊。它有几个特性啊,只有右表的数据函数小于1024才会下推,这个条件是由一个变量所决定的来so。呃,Fair,那么大家看这里有一个叫RA t Fi MAS in number 1024。就是这个参数决定。小于它,它才会通过印这种方式过滤啊。才会下推。另外呢,目前这个有一个合并方法,就自动的咱不用管,如果同时指定的in,还有其他的Fi,并且呢,In的过滤数值没达到。
10:10
最大值会尝试把其他F去除掉。什么意思呢啊,就比如说我同时指定的in,还有不容过率,还有最大最小值。三者同时用了对吧?呃,然后呢。我们印的限制是不是1024那个参数啊,那比如说我现在过滤数值就是小于1024,比如说就是三,那这个时候呢,虽然我们同时开了,我们它真正会去下推的是int类型,这个在我们刚才的例子有体现的啊来。打开我们这个query profile在这里呢,我们注意看。啊,就这个profile这个页面这里啊,你是不是看到三个,但是有个关键词,呃,叫什么,有没有下推到存储引擎,是不是只有in显示为处对不对,其他的有吗?没有这个大家要注意啊。
11:08
因为啊印这种方式是精确的过滤啊,即使没有其他也可以高效过滤啊。哎,处在同一个fragment才会有去除。的一个逻辑啊,这个简单了解一下啊,那这前面介绍的是核心的这几个参数,那其他的呢,其他选项主要是特定场景我们去调整啊,很少去调,针对你的特点,集群特点,你是资源密集型。啊,或者什么高频率的查询进行优化啊,有这么几个参数啊,对应我们这里是不是还有很多参数啊。对吧,啊,还有一些参数啊,就这些,那分别什么意思,简单过一遍吧,一个是mode模式,这个是下推策略,有off local global啊,默认为策略我们看一眼。
12:04
啊,下推模式全局下推啊那就行了,那还有一个等待的时长。等待每一个运行时过滤的时间默认呢啊是一秒啊,这里也能看到啊。Wait ten minutes。一秒。啊,把这个截个图得了啊,是翻来翻去的不舒服。好,再往下看。最大的数量。不,这指指定的是谁啊?布隆过滤器的最大数量。默认是多少十就这个啊,默认是十。就可以应用几个布隆过滤器嘛,啊十个啊,那接下来这是对布隆具体的设置,布隆的最小值,这是布隆的最小长度,还有布隆的什么最大长度,这个一般来讲我们设默认值就行了,最小有一兆,最大16兆啊,那对应的就是这两个参数。
13:06
还有呢,不能过过滤器的默认长度啊,默认两个兆对吧,这有一个最小有一个最大有个默认的啊,一般用默认都够了啊,默认都够了,就这个。好,再往下走啊,Max in number,如果join右表数据函数大于这个值。那么不生成一这个刚才讲过了,对吧,就1024这个。这就是我们涉及到的一个参数啊,那最重要的是哪个,就是对于type的选取啊,我觉得这个是比较重要的。好,这是几个参数的说明。那下面几个注意事项,我们也简单过一遍吧啊。呃,首先我们这个run Fi是根据等值条件生成的,不包含什么not值啊。
14:01
另外一个呢。不支持的是什么?下推到左外关联,全板外连接,还有NT。还不支持是一个常量的方式,对吧?啊,比如说什么等于什么这种常量啊,比如说呃,过滤条件是ID等于一这种啊不行。还有一些特殊类型不支持啊,是这个。Log log,还有位图、map。仅支持啊,那这个我们就简单看一眼就行了啊。这个就不啰嗦挨个去看了,这个就是大家简单搂一眼啊,一般来讲呢,还好。
我来说两句