00:00
好,那接着我们再往下去讲啊,接着往下讲了,就该说我们这个2.6了,这个呢叫范围条件的右边的列的索引的时效,来我们看一下。啊,这个是我们这个第六种情况范围条件右侧的这个列索引失效啊,这块呢,我们呃,相当于照了好多这个索引啊,然后呢,去执行我们这个啊CTRLC一下。嗯,把这个呢,我们拿过来,那这块的话呢,我们想把这个索引呢,都做一个删除啊,咱们现有的这个表中这个索引呢,已经不少了啊show index,然后from一下student是吧?来我们选中了做一个执行啊这个所以呢,你看还挺多的啊,那那下边这个执行呢,有可能会干扰我们这个,呃,所以呢,这个这个一个情况的一个展示,咱们呢,就调一下这个存储过程吧,上面咱们不是写了一个叫啊passenger。啊,咱叫drop是不是index。哎,就是我们这个啊,他就起作了,首先呢,写上我们这个数据库啊,叫艾特硅谷DB2这个数据库下的啊叫student这样的一个表,你看这个还是非常人性化的啊嗯,把这个呢,存储过程呢给大家了,然后呢我们做一个执行。
01:03
执行完以后的话呢,我们再去做这个受操作,那是不是就只有我们这个主键了,那就很干净了哈,诶,OK,行,就没有一些其他的这个索引呢,去干扰我们,我们去分析,嗯,这里边的话呢,Where看一下A有了,Class ID有了,诶name有了,说这个范围条件右侧的这个列索引失效啊,那我们还得给它上面呢,整一个这个索引去演示。这呢,我这样创建啊,Index I DX我叫,然后呢,我叫什么呀。Class ID啊,然后我再叫这个name,哎,这个啊。哎,Student这个是一个age。Class ID name,好,这个应该能看懂,我们在创建一个索引,是一个联合索引。针对的呢,是我们这个age class ID和这个name行,然后我们这时候选中呢,诶会不会是使用上我们这个索引呢,基本上大家应该有这个经验了,肯定会。肯定会是吧,哎,从这个结果上来看呢,也确实是使用上了,这个K的话是十啊,知道怎么得来的吗?我们个A的话呢,哎,它是不是占了这个五个呀。
02:06
然后那个class ID啊看一眼。往上走,Class ID。在这啊INT4个啊,他也因为闹,是不是他也是五个,所以说这块呢,就十个内的话呢,没有用上,诶所以说这块呢,就没有把那个63呢给加上了,那事实言外之意呢,就是我们这个联合索引呢,咱们只用了其中的两个字段,哎,用了它了,用了它了,那为什么这个内幕没有用上呢?诶主要原因呢,就是我们这个索引呢,大家你看我们是不是这样创建的。呃,先用这个,咱们前面讲了一个叫最左前缀的原则,呃,你这个用了它以后呢,后边这个呢,才能考虑再去使用,但是明明我这个也用了,怎么用它就没用上呢?主要因为我们这个呢,是一个范围的一个情况,在这种范围的这种场景下的话呢,我们右边这个呢,就用不上了。哎,就用不上了,这个体验呢,就会稍微的差一些。是吧,稍微差一些,那呃,如果说针对于我们这个场景的话呢,这个该咋去弄啊,哎,同学说说老师诶那我们就这样这样这样行不行啊,我把这个CTRLX,我这个CTRLV一下,然后我这块呢按一下,我把它再交换一下。
03:12
啊,有意义吗?没有任何意义是吧,来走一下啊,就是对于我们优化器来讲啊,就是你这里边你先写谁,先写哪个后写哪个,其实无所谓的,优化器的话呢,这三个它是可以自己去颠倒顺序的,关键呢,就是你这个索引,你索引呢,优化器帮你颠倒不了,那你这个优化器里边,你这个索引里边呢,你是先写的卡,先写的范围,那么范围以后的这个呢,就失效了。那要想呢,我们这个能够起作用怎么办呀?啊,怎么办啊,啊有办法,那就是大家呢,你再去定义我们这个索引的时候呢,是不是你先把这个确定的这种等值关系的字段先列上,然后再列我们这种范围的,把列范围这个是不是写到最后就可以了呀,那所以说我们这时候呢,是不是在创建一个我先写内幕的。啊,再去写这个,哎,叫。Class I did。
04:01
对吧,哎,或者我就写一个class叫。有点长啊,我就想起个叫cid啊行,我就哎这后边不用改了,我创建一个这样的这个,哎,这个不对啊,这主要得改这是吧。看后边这个才决定了我们这个顺序啊,前面这名的话呢,其实你愿意怎么叫就怎么叫了,行把这个呢,我们去做一个执行。好好,这个执行呢,是非常有意义的,执行完以后呢,以后的话呢,大家你再看我们这个操作,我去执行的时候呢,你看age name age name,诶在克拉ID范围后边呢,就失效了,咱们后边也没东西了嘛。你这个也是最后一个是吧,好,此时你看我们做做执行,此时的话呢,咱们用的是不是就是这个索引了。挺好的是吧,哎,就用的它,哎,那这个呢,用的是我们这个第,呃,最后创建的这个缩引,那我问一下这个呢。区别在哪呢?就是我这块呢,是把这个范围的写这儿了。嗯,这个时候呢,还能用我们这个缩引吗?或者这个位置呢,如果用它这个索引是还是73吗?73不就是我们I age这块呢,是五个字节了,这呢是五个字节的,然后这个呢,是不是63呀?哎,所以呢就全用上了,说白了就是73,那我们要执行这个的话呢,也是73吗?
05:11
他就说好像够呛了,因为我们这个范围写中间了。哎,注意还是我刚才说的那个点,呃,优化器的话呢,至于你这几个条件,先写谁后写谁,中间是暗的情况下呢,无所谓啊,主要呢看一下你这个,呃,联合索引当中呢,是先写谁后写谁的差异液化器呢,它自动的就把这两个呢做了一个交换啊,先考虑的是这个等值的情况,最后呢考虑范围的啊,所以呢,还是能够使用权的。啊,这个大家要,诶注意一下啊,就要范围的一个情况,嗯,那如果呢,我们出现这种小于啊,小于等于大于大于等于between啊等等这样的场景,那范围这个索引它自己呢能够应用的上,但是他右边啊就用不上了,诶这个我们所谓的右边啊,大家你不要看这个的右边,是不是要看我们索引是吧?你这个要是范围的话呢,它的这个右边啊就用不上了,看索引啊,不要看我们这个,呃,Where尔语句。
06:04
好,那么在实际开发当中,像我们查询金额呀,日期呀,往往都是范围的啊,这个大家呢,记着,呃,这个呢,你看把它放到where的后面,这个呢,放到where后面呢,诶主要呢,还是得考虑你放的这个索引的啊这个这个我在这说一遍,这个写到外后边呢,主要是呃,给你一个暗示,让你呢是最后呢去考虑这个范围索引是吧?这个我们还得在这写清楚,以免大家这个误导啊。就是呃,创建的。哎,主要说的还是这个事啊,创建的这个联合索引中是吧,诶务必把这个A范围这个字段涉及到的。哎,这个哎写在最后是吧。哎,主要的是这个事儿,行,这就过了,然后的话呢,我们再看下边这个叫不等于的一个索引失效情况啊,CTRLC。那这我们是这个第七个点。不等于这个不等于的话呢,我们对应的这个,所以呢,就会产生这种失效的这种情况,来我们这块呢,针对的是我们这个。
07:05
啊,选择过来执行,嗯,然后在这里边的话呢,我们在name上呢,给他一个索引啊,我这块呢,就提前创建好了啊拿过来。好在这个name上的话呢,我们有一个索引,然后的话呢,我们再看一看下边这个where student name呢不等于ABC,首先的话呢,等于ABC。等于ABC这个呢,是不是肯定能够应用上我们这个索引对吧。啊,这个是没有任何问题的,那现在的话呢,我们替换成了叫不等于了,那我先用的是这个符号啊不等于。哎,我们说呢,这种不等于的操作呢,就不能够去使用索引了,那就是个out的场景啊,那你也能想象得到啊,我们在这个B加数当中呢,你说要等于ABC,我就直接呢,是不是就找那个等于ABC的那一项了,不等于ABC你你咋整?是不是就得一个一个的,我们这表数据一个一个去找了,是吧?哎,所以就用不上这个索引了,不等于的话呢,你可以这样写,是不是还有一个符号一样的道理啊,都不能用。哎,我们选中。
08:00
啊,执行啊也不行是吧,啊这个注意一下。嗯,索引失效啊,就过了下面这个呢叫is not呢,可以使用索引,Is not not呢无法使用索引。这个是咱们的这个八。哎,八的这种场景意闹可以使用索引,就是我们找这个空的这个情况,哎,选中。哎,回过来说呢,Where,这个age呢,Is now。A上咱们有索引不?咱们倒是见过这个联合索引是吧?那咱们直接看吧,来走起。在我们这个age上的话呢,你看我们这见过这个联合索引啊,所以呢,他考虑上使用了啊,只使用了联合索引的第一个字段是就是五了,就这A嘛。嗯,用上了,嗯,这个呢,是可以使用的,那is not not呢。啊,Is not not就不能够使用了。你看就没有了,对吧,是个out的情况,跟咱们上面有点像,In闹呢相当于你就等于某个值,In闹呢相当于不等于某个值,所以说呢,它就用不上了啊,你要想一下这个B加数也是一样啊,你要等于闹呢,是不是直接找那个闹的位置,要不等于闹呢,那是不是就得一个一个的全都看一遍,看看谁不是闹。
09:07
哎,所以这个呢,就用不上这个,所以啊,那基于我们这样的一个点的话呢,咱们在实际开发当中啊,就有一个经验性的一个要求了。一般呢,咱们在设计数据表的时候呢,大家注意通常情况下这个字段啊,咱们都给它去添,添加一个呢,叫闹闹的一个约束。啊,就相当于我们都加上这个叫非控的约束,那这样的话呢,你如果去做这个查询操作的话呢,咱们是不是就呃不用说加这个叫is闹闹了,因为所有的数据呢,是不是全都是is闹闹了。啊,全都是一闹的话呢,我们就呃你你可以再加你其他的约束条件,这个这个这叫什么,呃,过滤条件是吧,然后呢,你该加索引呢,去加索引就行,就能够去使用上了,那有同学会想,那么有些数据呢,就是有这个not的需求,怎么办呢?那你可以考虑呢,比如说把这个数值类型呢,你就设置成是零,把这个粗串类型呢,你设置成这个单引号里边什么也不放,哎用这种场景呢,去替换原来所谓这种闹的场景。啊,就是这个意思啊,那此时的话呢,你就可以考虑呢,去使用咱们这个缩音啊,注意一下,同理的话呢,这个not like也是一样啊,有这种not的非的这个我们就诶只能是进行全表的一个扫描啊。
10:12
下边这个like啊,以通配符百分号开头的索引呢失效。那这个是咱们这个第九个是吧,咱们在讲前边这个呢,提到一个关于啊函数的一个调用的时候,我这时候这个like的话,你看我们是ABC开头是一个确定的啊后边呢是一个不确定的,呃,现在呢,我们想提到的是以这个通配符以它开头的这样的一个情况呢,是会导致失效的。啊,我觉得大家只要这个B加数,脑海当中有个B加数的话呢,其实我们这里边失效的案例啊,大家基本上都是可以平推过来的,可能不用我这块呢,一个个去讲,我这块讲的一个主要目的呢,主要就是让大家呢看一看,事实呢确实如此是吧?哎,很多时候呢,理论上我们就都是可以分析出来的。你看一下我们在这个name上的话呢,咱们是有一个这个缩引的,当然你看我们这个写法的话呢,就不能够去使用这个索引了,诶这个是能使用的,对吧,那这个咱们是以这个确定的开头的啊来走起。
11:07
啊,能使用的啊,当然呢,我们CTRLC一下啊,我粘过来。嗯,把这个CTRLC。粘过来以后的话呢,我前面呢加了一个百分号,后边这块你加不加的我就不管了,反正总之呢,你是以这个通背符开头的,凡是这样的场景的话呢,我们说就不能够去使用这个缩音了。就是一个全表扫描啊,原因的话呢,能想到吧。啊,原因的话呢,就相当于是你上来就不确定了,那我怎么去你这个笔加树里边去找,你说我这个找第一个,这靠不靠谱啊。是吧,哎,这个没法选择了,那还不如是相当于我们就进行一个全包扫描,一条一条数据呢,是不是都过一下,看看谁是以比如说是AB结尾的。对吧,哎,就成这个样子了啊啊这样写的话呢,相当于是里边包含这个AB的根据开头是什么,这个我没法确定啊,只有开头这块确定呢,我们才能够真实的是不是开始走这个B加数看看呢,是不是一开始这个是A是吧,比A大比A小啊跟A相等不,那我们才可以去比较啊,注意一下,所以很好理解。
12:05
好,那么这个阿里巴巴开发手册中也强制的要求了,说页面搜索严禁左模糊或者全模。啊,这个如果你非要用的话呢,那你就走搜索引擎去做,那我们SQ当中呢,是不能这样写的,你这样写的话呢,这个索引就用不上了啊OK。好,然后再看这个第十个点,这个第十个点呢,咱们在讲这个工具的时候呢,其实提到过关于这个index这样的一个情况。来,张过来说这个奥前后存在这个非索引的列。存在了一个非索引能力啊,所以呢就失效了。嗯,这个咱们直接上例子来把这个呢,CTRLC。拿过来,嗯,这块呢,咱们再去照一下吧。我那个赵呢。嗯,我想执行一下咱们这个存储过程。把这里边儿的索引呢,该删一删就删一删,找不着了,写一下吧。
13:02
Drop先是call是吧,哎,Call一下我们这个啊,Procedure,然后drop一下。这个index。艾特硅谷DB2下的student。哎,这么着把我们这个表中的这个索引呢,咱们再去清一下,然后呢,我们再去收一下啊index。From my student。好,选中啊,走起。那这时候呢,还剩这一个主键了,行,那针对于我们这个查询语句的话呢,这叫age,这个叫class ID,行,呃,我们想给大家先这个演示一下啥呢,就是嗯,不能够使用索引的啊,所以这块呢,你看我们先去创建create index,比如说我们先呢,针对这个age呢,咱们有一个啊student。这里面是这个age行,哎,我们选中,就我这呢,只针对这两个字段中的一个,咱们去创建一个错音,至于说你是A还是class ID,这无所谓啊,执行了。
14:07
啊,稍微走一下,这完以后的话呢,我们这时候看一下,在我们中间这个是个O的情况下,相当于取一个是个并集,这个情况下呢,我们能不能去使用这个索引呢?注意是不行的。啊是不行的对吧,哎,那主要原因呢,就是因为我们是奥嘛,就相当于你全要,那我们这部分有这个呢,就没有。那你说我们全都要,那那那有啥意义啊,你这个再去找他的话呢,你就是这个意思啊,你比如说我们把这个删掉了话,那问大家你说这个我们会用,所以吗?是不是肯定不能用啊,是不是就是个哦啊行,那现在既然你全都要这个有索引,这个没有索引,那不还得是一个全包全板的一个扫描吗?你说我们这个用索引了,这个用完索引之后呢,你这个是不是还得全面扫描。啊,用一下索引这个在全盘扫描加一起的时间呢,是不是还不如我们直接来一遍全盘扫描快啊。对吧,哎,所以说呢,我们这个呢,就不用索引了啊,就没有索引之说啊,就看到这样一个情况,对吧,那什么时候能够用索引呢。
15:00
必须呢,我们再给它,哎哦,后边这个字段呢,也加上这样的一个缩引它才行。啊,比如我们这个呢,叫CAD是吧,好这时候呢,我们选中了做一个执行。前后这两个字段呢,都有索引了,哎,那这时候你用all的时候呢,咱们就有个具体的type,是不是我们当时讲这个时候说过叫index啊,相当于你把这两个是不是给它合并在一起了,哎,你看后边的也有这个using UN是这两个索引合一起的,哎,那这时候呢,我们是能够用上你这个索引的啊,查询效率会更快,不用这个全表的一个扫描了。那就这个道理啊。嗯,这这就不用多解释了,嗯,再下边这个呢,就提到了这样一个点啊CTRLC。那这个呢,就比较好理解,其实整个的话呢,咱们这里边失效这规则啊,都不太难理解啊,我已经说过了,我的作用呢,就是给大家呢,诶写一些案例是吧,诶所以说这块你看似咱们讲的时间呢,没特别长,当然呢,这块诶准备案例的话呢,还是花了一些这个时间的,每一个呢,都得把这个效果呢,得给它模拟出来啊说呢,数据库和表的字符集啊,统一的使用U8啊MB4,或者你使用U8MB3啊都行,这呢使主要是针对咱们MYSQL8.0当中的,因为默认的这个数据库啊,呃都是MB4的,所以我们这儿呢,也都用这样的一个字数机。
16:16
啊,其实主要呢,想强调点就是你要一定要统一啊,为什么呢?因为不同的这个字符集在进行比较前啊,它一定会进行一个字符集的一个转换,那一旦转换的话呢,你可以理解成就会涉及到这种转换函数的一个使用,一旦使用函数了,那我们相应的话呢,是不是索引就会失效啊。哎,所以这样有个隐含的点,大家一定要小心一点啊,注意。好,那么整个呢,关于这个索引失效也好,还有我们编写的S的一些规则也好,咱们就讲完了,在这里边呢,我们再做一个讲的一个小练习,这呢有个联合索引叫ABC,哎,那么哪些情况呢,我们能够使用上索引,哪些情况呢又不能使用索引,哎在这呢,我有一个罗列。啊,这里边儿我们都还写到了,哎,其中呢,大家比较容易错的呢,应该是这样一个场景。那这个呢,AB是这样子的啊,C是这样的,这个呢是能够使用的啊,那这个能使用的话呢,这个其实也是可以的啊,像这种的话呢,只能是用到这个A这一段是吧,哎,B这块就用不了了。
17:11
行,前面呢都已经讲过了,所以这个呢,大家就正常的做个练习,你看看看到左边这块,你能不能自已把右边这块呢,给它擦掉,哎,你看你填写呢,是不是正确的,那就可以了。好,然后呢,我们看一下这个一般性的一个建议,或者是一个总结性的内容说,对于这种单列索引来讲,尽量的选择针对当前宽过滤性最好的一个索引。啊,如果说我们在VR当中。啊,注意咱们在外二当中是不是写了这几个条件是吧,And呀等等的,如果说你没有这种联合索引,只有单列索引,那这块呢,是不是,哎这时候呢,就要挑。啊,比如说呢,呃,我们针对这四个字段呢,假设都有单列索引,那液化器的话呢,它就会去挑那个哪个过滤性最好的啊,作为一个成本最低的去选择,那要我们自己创建的话呢?呃,你要是都创建索引吧,这个呃表中的索引一旦多了,是不是维护成本也很高,前面也说过了,呃,那你要是只能创建一个的话呢,你就挑这里边哪个过滤性最好,比如通过通过这个字段过滤完以后的话呢,呃,我们只过滤到了10%的数据。
18:10
要是通过这个字段过滤的话呢,我们能过滤掉99%的数据,那是不是就可以考虑这个字段啊,假设就这俩的话呢,这俩去比较是不是就选这个啊。啊,就这意思说,在选择这个组合索引或叫联合索引的时候,当前query中过滤性最好的字段呢,哎,这个在我们索引中呢,位置呢,越靠前越好,也因为呢,过滤性越好的越靠前,经过它过滤完以后,剩下的数据越少,越少的话呢,你给后边的字段的压力呢,是不是就越小一些。啊,你要比如说我们把这个,呃,其中的一个字段叫性别啊,作为第一个这个字段了,过滤完以后的话呢,你只过滤掉50%的这个数据,那后边还有50%呢等着你呢。这个稍微的就差一些。啊,这个大家注意一下。下一个说,呃,这个联合索引当中,尽量呢去选择包含当前query中啊,V尔子集中更多字段的这个索引啊,这个呢,优化器呢也是这样选择的,那字段呢越多,相应的我们呢可以,呃,这个相当于你用的这个索引的话呢,就是更充分一些呗,对吧。
19:07
选择走个索引中啊,如果某个字段呢,出现范围了,那尽量把这个字段呢扔到这个后边,这个呢,主要是我们在索引的当中啊,咱们把它扔到最后边,总之一句话啊,书写搜Q语时,尽量的避免索引失效的情况。啊,毫无疑问吧,讲这么多不就是为了说这句话吗?啊,行,那么关于我们第二节的内容了,咱们就说到这儿。
我来说两句