00:00
好,那接着的话呢,我们来看这一章的第三个内容,叫做索引的设计原则啊,咱们说呢,索引啊这个设置好以后呢,是有好处的,能够提升我们查询的时候呢一个效率,对吧?但是呢,所以呢,它也是一把双刃剑,那所以呢,设计的不合理,或者说呢,我们缺少相关的这个缩引,都会导致呢,咱们在查询的时候呢,造成这个性能的障碍,那到底我们该如何给表中的这个字段呢去添加索引呢?诶这儿呢,我设计了一些内容叫做索引的设计原则,那么大家呢,在日后创建索引的时候呢,呃,应该说都要遵循这里边的,这里边儿的一些原则,那涉及到的具体点呢,就是说哪些情况呢,我们适合去给字段添加索引,哪些情况呢,就不适合给相应的字段呢,去添加索引,那么这里的内容啊,都来自于实际当中经验,所以这块呢,我们也会配备相应的一些数据的测试。那首先的话呢,我们需要呢,去搭建呃,这个两个表,那么这个表当中我们去造一些这个伪数据啊,达到这个100万条这个数据,然后呢,我们在这个说相关的这个原则的时候呢,咱也辅助的可以去做一个测试啊,就是这样一个道理。
01:03
好,那么首先的话呢,我们把这个数据库表啊,还有呢,我们添加的这些模拟的数据呢,咱们给大家提供好啊,那首先的话呢,我们回到这个,咱就在这个色Q药里边去给大家演示了啊,咱们再去新建一个这个文档啊,这个呢叫呃零四是吧,诶我们来测试呢,叫索引的一个设计原则。啊,这个我写一下啊,索引的一个设计啊原则OK,那首先呢,我们选中一下啊,CTRLCCTRLS,把这个文件呢,咱们保存一下啊,这个稍微放大一点啊,首先的话呢,我们这块呢,是提到的第一个问题啊,就是数据的一个准备。啊,数据的一个准备行,那这儿呢,我把相关的这个数据呢,咱们就直接粘过来了啊这呢是我提前呢,都已经准备好的啊,设计好的这样的一些数据啊,稍微变小一点啊,现在把这个都拿过来,然后呢,我给大家做一个解释。好,CTRLC。嗯,下边。嗯,这块啊,CTRLC。
02:02
嗯,这样。啊先粘到这儿吧,来咱们先接着说一下,首先的话呢,这里边我创建一个数据库啊,这个数据库呢,叫艾特硅谷d be,前面的话呢,咱们创建的是叫艾特硅谷DB对吧?这个我用的是这个DB啊,新造的一个就大家呢,如果你要是不想用这个语句呢,去现创建的话呢,也可以怎么办呢?这个咱们在这个课件当中啊,打开资料,我这呢又提供了一叫艾特硅谷DVE这样的一个测库文件,你把这个测库文件的数据呢导进来也行,但是呢,我不建议你这样去做,为啥呢?因为这里边我造了模拟数据呢,就达到这个百万条数据了,你要是其他导进去的时候呢,花的时间可能会长一点,那就这样个道理。行,那来回过来,首先呢,我们去创建一个这个塔贝斯啊,走起。创业好以后的话呢,我们就使用当前这样的一个database。那在这个嗯,艾特硅谷DB1啊这个当中呢,我们去这个创建两个表,一个呢叫做学生的信息里边呢有ID,这个呢就是个主见了,然后这个呢是叫student ID啊这个你看主见呢,这个no呢,其实可加可不加了,对吧?行,然后呢,下边这个呢叫student ID,这个叫学生的名字啊,学生选课嘛,选课的话呢,他选的这个课程的ID,还有他在哪个班级,然后创建的这个时间是什么时候,那这样的一个创建好,那这呢,我们把这个表呢做一个创建啊走起。
03:19
可以了,然后呢,我们在创建另外一个呢,叫做cos表,那我们在整个呢,所以呢,测试当中呢,咱们会用到两个表,这个呢叫cos表,课程表有ID,有课程的ID号,还有呢课程的名称,那这样的一个情况来我们选中呢执行一下。OK,没问题了是吧?诶这里边呢,大家可能没有见过这样一个写法,就是我们设置呢叫auto increment,那咱们在添加的时候呢,就是它会以前咱们设置的时候呢,它就自动往上去走了,这样呢,我们也可以呢去设置呢它的一个初始值,那就这样的场景,然后这呢是字符集,这个是engine,这个咱们前面都讲过对吧?行,那么这样的话呢,我们就在当前的这个艾特硅谷一这样一个数据库下呢,咱们造了两张表,然后呢,我们往里边添加数据的话呢,我们是使用的模拟数据,咱们在讲上篇提到这个存储过程,存储函数的时候呢,当时我记得有一道练习题也说到了,说我们去模拟一些数据的创建,对吧?那么当时的这个具体的讲法呢,咱们也都说过了啊,然后这块呢,我们这个去网,尤其是这个学生表里边,呃,去模拟添加数据的话呢,咱们使用的是一个存储过程。
04:22
因为咱也不需要任何的返回,但是呢,这里边涉及到呢,就是比如说一些字符串的信息,那我们呢,就是随机去生成,那随机生成的话呢,我们就使用了一个函数,这块呢,我们也先去提供随机产生字符串的这个函数,以及呢,产生这个随机数的这样的一个函数啊,因为我们上面也有这个int类型的,对吧?好,那这里呢,我们就把这个函数呢,先做一个这个创建啊,这个呢,Di这个咱们前面都讲过了,我就不用多去说了。好,这样呢,我们先去做一个创建。行,那我这块呢,你看我去创建这个函数的时候呢,会报这样一个错误信息,这个错误信息的话呢,咱们在讲上篇创建函数的时候呢,也出现过这样的点,他说呢,是不是得做这样的一个设置啊,说这个login trust function CS是吧,把这个变量呢,我们需要做一个设置啊,CTRLC一下,呃,首先呢,咱们在这块呢,呃,做一个查看。
05:13
啊,首先我们这块做一个查看啊,怎么查看呢?比如我这块这个select是吧?啊这样的方式我们查看一下当前这个变量的一个值啊走起。好,我们看到这个值呢是零,相当于呢,默认情况下呢,我们就不去trust相信这个函数啊,我们必须呢,把它这个值呢,给它改成是一个一才可以对吧?那具体修改方式呢,这块你就去做个set呗,把它这个值呢改成是个一啊就行了。选中啊,这个我没有指明呢,你是session和global的,默认就是当前session的了,对吧?好,我们选中了做个执行。啊意思啊,说我们这个呢,变量它是一个global级别的,那我们就必须要给他加上这个global了,是吧?OK,就是它呢,在当前绘画中呢,是没有这样的一个参数的,那必须得是个global级别的,好走走起,那这就可以了,那改成一以后呢,你再去查看这个值呢,它显然就是一了,然后呢,我们再去创建这个函数呢,就可以了啊再执行。
06:06
看一看没有问题是吧?好,那这里边说一下啊,这个为什么我要把这个参数值呢,给它改成一呢,你看这里边涉及到一个叫log b啊,实际上呢,对应的就是我们有一个后期要讲的日志文件呢,叫做blog文件,我们讲到这个主从主从复制的时候呢,呃,会说到啊这个这是我们的这个主机,然后呢,我们再回去设置这个叫从机画的稍微有点小了,这个实现一个叫读写分离,然后主机呢,进行的相关的这个SQ的操作呢,我们会把这个信息呢,写入到这个叫blo这样的二进制的文件当中。然后呢,我们这个从句呢,去读这个blog日志,那这样的话呢,实现我们一个主从数据的一个同步机制,但是呢,我们再去这个编写这个circleq的时候呢,默认情况下呢,就是我们要是定义一些函数就有可能呢,呃,这个函数呢,记录到这个B日当中,在从句读的时候呢,有可能会达到我们这个数据不一致的一个情况出现,所以默认情况下呢,这个MYSQL数据库服务器呢,他就不相信是吧,就是不trust这个方式。
07:03
OK啊,所以说呢,我们这时候呢,要想去创建函数呢,就需要把它改成是一个一啊就这样个道理,行,那这个呢,是我们临时的一种修改方式,那如果说大家呢,你想这个永久化的一个修改方式的话呢,我在课件里边有写了,呃,在Windows当中,在Linux当中,我们去修改相应的配置文件,在这个MYSQLD下。那这也是MYSQL地下,我们去修改这样的一个参数就可以了,然后呢,修改完以后呢,重启一下MYSQL服务器啊,这都比较简单啊,就过了,那接着的话呢,我们再去创建一个产生随机数这样的一个函数啊,走起。啊,没问题,行,那这两个函数呢,我们创建完了,接下来的话呢,我们就需要呢,去创建这个存储过程,真正的把这个数据呢,添加到我们这个course当中,添加到我们这个叫student当中,好这呢我们把这两个呢拿过来CTRLC。这个呢,具体的细节呢,我就不在这儿具体去剖析了,有兴趣的话呢,大家直接拿到我们的代码呢,你去看就行,咱们在上片当中啊,我都已经讲过这个关于存储过程,存储函数的这个语法规则了,里边呢,还涉及到了我们相关的一些循环结构啊,变量的定义这样的这个场景,好,那我首先呢,执行上边这个,这个里边呢,我们是把这个数据啊,添加到咱们这个course当中啊,添加到这个course当中,OK。
08:09
来先把这个存储过程呢,我们执行好,这呢只是一个存储过程,还没有真正意义上去添加啊,先创建好,对对吧,执行。好,然后呢,创建我们这样的一个存储过程。嗯,好,然后下边的话呢,我们存储过程也创建好了,下边呢,是不是就涉及到我们具体的一个调用了,来我们看这存储过程这俩有了,然后这块呢,有这个函数,OK,行,那下面的话呢,我们去调用一下咱们这个存储过程,哎,我呢往这个课程当中咱们添加呢,是100门课。那100门课,然后学生这块呢,我们添加的是100万条的一个数据啊执行。嗯,这个呢,相对来说就快一些,对吧?啊,那执行完以后的话呢,大家也可以呢,去select查询一下。那select,我们叫count星。嗯,康来from一下我们courses。哎,这么着对吧,那选中了执行,那这呢,我们就100条数据啊,在这加一个啊叫调用啊存储过程。
09:06
好,那然后的话呢,我们去往这个学生表中呢,去添加100万条数据,这个添加过程呢,稍微的时间长一些。啊,这个时间呢,会稍微的长一些啊,那这儿呢,我就呃,录制这个视频的话呢,咱们就稍微的我暂停一下。好,继续,诶这呢,我们大概花了这个两分钟的这个时间,我们把这个书页就创建好了,创建好以后的话呢,我们这块呢,也是做一个select,做一个查看啊select count,哎星一下,哎,From一下,我们这个叫student infer OK,我们看一看这个表中的数据呢,是不是100万条。诶诶没有问题对吧,行,那这样的话呢,把这个数据呢,就准备好了,准备好以后的话呢,我们下边来看一看相关的这个,呃,设计原则。好,那接着的话呢,我们就看下边这内容,下边这内容的话呢,我整体上来讲是分成两块的,第一个呢,就是哪些情况适合加索引,第二呢,就哪些情况呢不适合加索引啊,首先我们来看这个适合加的,哎,我们在讲解这些原则的时候呢,大家诶脑海当中要浮现两个图,一个呢是我们讲的这个句促索引啊,浮现一个必加数,另外呢,诶浮现一个呢,就是非居素索引啊,或者我们也称为呢叫二级索引,对吧?前面我们在讲这个索引的底层结构的时候呢,都说过了,那么在讲这些规则的时候呢,很多时候呢,大家就发现哦,原来如此啊,就是以前的时候呢,你可能这些准则呢,是这个硬死记硬背下来的,那现在呢,有了这个B加数,这个加持之后呢,大家再看这个准则呢,就非常的清晰。
10:31
那我们讲的叫胸有成竹对吧,你会非常的这个自信啊,他是怎么怎么回事儿,可以娓娓道来,行,那么下边呢,我们就具体来看一看,首先第一个哪些情况呢,适合呢,去创建索引啊,咱们在这儿呢,也做一个来说明啊,这是我们讲的这个第二个内容。那么这里呢,我罗列出来一些规则,那我们就一个一个来看,首先第一个说字段的数值啊,它有唯一性的一个限制。啊,如果呢,大家你发现呢,我们在创建的这个,我用这个一来表示啊,呃,如果呢,大家发现呢,我们在创建这个表中啊,有一些这个字段呢,它是有唯一性的限制的,那我们就推荐大家在上面呢,去添加一个叫唯一性的索引。
11:08
呃,当然这里边儿这个唯一性呢,你要上面本身已经有了一个有的约束了,那就不用再去添加唯一性,所以呢,因为它会自动的啊去添加对吧,或者说呢,我们去添加了一个唯一性的,所以呢,它也会自动的给我们去加一个唯一性的约束啊,他俩是互相这个呃成全的啊。呃,那这里呢,其实想说的是啥呢?是这个字段呢,明明它是一个唯一的,但是呢,我们既没有唯一性约束,也没有唯一性索引啊,这个呢就通常就不好了,你比如说我们在这个学生表当中这个学号,那其实呢,它就是一个唯一的一个特性啊,你要是没有加任何约束或者索引的话呢,那如果我们要讲定位表中的一条记录。那这时候我们用这个学号去查,或者说呢,经常性的用学号去查,你要没有索引性能呢,肯定是要差的。所以说呢,一般呢,我们说要给这个表中的一些字段去加索引呢,你先要观察有没有那些唯一特性的这样的一些字段,优先给它们加索引啊,这是我们要说的这个点。
12:02
好,那么说到这个点以后,呃,下边的话呢,你看提到这个事儿啊,说呢,在业务上具有唯一特性的这个字段啊,即使是组合字段也必须建成唯一的索引。啊,这呢来源是阿里巴巴,那你看阿里巴巴呢,在这个规范当中,他提到一个词叫必须不管呢,你这个唯一特性的这个字段呢,是单个字段还是说呢,我们联合在一起构成一个唯一的特性,那都要给他考虑,要加上一个唯一索引。啊,查找的时候呢,性能会高对吧,像我们用这个B加数来讲,比如这是一层,这是一层,然后再来一层到这儿,那我们要是使用这个唯一索引的这个字段去查找,它就会定位到这一条记录,一旦定位到大以后的话呢,我们直接就停止就完了,那前后都不用再看了,因为它只是唯一的。啊,它的值是唯一的啊,那这呢,相当于我们加了一个页,两个页三个页啊这个速度呢是比较快的,下边说明说不要呢以为唯一性,所以呢添加呢,导致了我们再去引射的时候呢,这个速度变慢了,这个大家应该能理解对吧,因为你添加数据数据的时候呢,是不是要维护我们这个唯一的索引也要做一个修改啊。
13:01
但是这个速度呢,损耗呢是可以忽略的,但是它对于查找的速度提升是非常明显的。哎,非常明显的,那这个关于它呢,我就先不去列了,因为咱们下边这块外当中呢,诶有跟它类似的这样场景,咱们统一呢,在下边来测试。行,下边呢,咱们来看这个第二个啊,CTRLC一下,我这边呢,一边写呢,大家一边呢,也往这个脑海当中呢,去记一记啊,在面试当中,在我们实际开发当中,你就要遵循这样的一些原则了啊,不能左耳朵听,右耳朵出啊进右耳朵出,那那就坏了是吧,好看这个说频繁的作为外耳查询条件的字段啊,这个呢,实际上是我们比较务实的一个操作了。咱们在写这个查询的时候呢,老师在Y2当中用某一个字段或某几个字段,我们就要考虑呢,给这个Y中涉及到的这个字段呢,去加上这个索引了。哎,经常被使用是吧,尤其呢,是在这个数据量比较大的情况下呢,我们创建普通索引可以大大的提升我们查询的效率,注意你看这叫普通索引,没有说我们这个字段,这个字段你不一定是唯一的嘛,所以那就不要去建什么唯一索引了,就普通的就行。
14:04
比如说我们这个学生表当中啊,我们针对这个叫student ID,那这个字段呢,我们去创建索引。啊,给大家去创建索引,首先的话呢,我们如果要是不呃创建这个索引的话呢,我们先去做个查询,咱们看看这个效果来这块啊,咱们去做这个测试,嗯,那首先的话呢,我们先这样啊,先去查看。啊,查看咱们当前这个叫a student infer这个表中的这个索引情况啊,这个咱们前面都讲过了,是不是叫收index,然后诶from一下叫student infer,对吧,OK。好,那这个我们先做一个查看。啊,此时的话呢,我们这里边呢,只有一个约束啊,那就是主见约束针对的就是我们这个ID啊,注意这个ID呢,跟我们student的ID呢是两回事儿,这个呢是主见,那我们学生的话呢,他可能呃张三,比如这个学生他ID呢是1001,他可能会选好几门课,所以这个student这个字段呢,他不是唯一的啊,这个大家要注意一下。
15:00
好,那么针对于我们这个student ID,咱们做一个查询,那此时呢,由于它不是我们这个缩引啊,相当于这个时候我们说这个student。这个ID字段上是没有这个索引的,在这种情况下呢,咱们来做一个查询,我就呢随机呢举了一个数来针对于他呢,我们走起。好,查询出来了,这时候我们一共查出来了,这个叫七条记录花的时间呢,是不是276毫秒啊,啊,这个我们在这稍微标识一下啊,276啊,这个我用这个毫秒来表示了。好,那么接下来的话呢,我们给这个student ID这个字段呢,咱们去添加索引。啊,这个我们这样上啊给。这个字段。啊,CTRLC。哎,添加,哎索引这个添加索引呢,咱们都讲过了,你可以用al这个table的方式,也可以用这个create index方式都行啊这个我就用table吧,那我们针对的是这个student infer是吧,然后I的一个index。
16:01
啊,我这个起名字的index student ID啊,针对的是我们这个叫student。ID这两个字段没问题是吧,好,那这时候我们选中了去做个执行。诶大家你会发现,你看我们创建这个索引的话呢,也需要花一定的时间,那因为它真正呢,要是不是创建这样一个结构,而且呢,还要占据的占据相应的表空间的大小,大家呢,如果去查看我们底层这个ibd这个文件的话呢,是不是由于你创建这个索引这个文件呢,也会变大,对吧?诶这个很容易理解,那创建完以后的话呢,我们再去做一个show,查看一下是不是成功了。啊,没有问题,索引名索引的字段OK,已经有了,那在已经有的情况下呢,我们再去呢,呃,使用我们这个字段呢,去做个查询啊,字段上呢是有索引的,那我们再去查看这个时间是多少走起。好,大家看我们现在呢,查询出来还是这个气象数据是0.043啊,那就相当于是43毫秒呗。对吧,诶43毫秒,这呢,我们是只查询一次,大家呢,可以多次去查询,然后取一个平均值,那你就能知道呢,它中间这个,哎,这个性能啊,确实呢是有提升的。
17:07
对吧,OK啊好,这呢是我们说的这个点啊,在外当中经常出现的话呢,我们就把它呢去,诶这个上面加一个具体的索引啊就OK了。好,这呢是我举的这个例子,这个例子的话呢,大家可能会发现这个时间执行的比较短,因为每次呢,执行的时间呢,它也都不一样啊OK,然后接着我们看这个第三个点说经常呢,Group by和order这个列。哎,我们这呢也拿过来,这是咱们这个第三个点。哎,这个呢,我粘过来的时候呢,大家也思考一下啊,为什么是要加。那我们说这个索引呢,咱们在某一个字段上创建了它其实呢,就会按照这个字段啊,或者你是个联合索引,那就是几个字段对吧,那整个呢,给我们搭建一个必加数,涉及到就是你这个字段呢,会一个顺序的方式呢进行存储,那么我们要是group by,后边这个字段呢,恰好就是你所引的这个字段,那你想想我们,呃这个先说order by吧,Order by的话呢,后边呢,要排序本本身我们这个。
18:06
Sorry啊,本身我们这个索引的话呢,它都已经排好序了,对吧,那你在order的时候呢,是不是就节省这个排序的时间了,那同样的这个group的话呢,它要对相同的值呢,要组合成一组,那你相同的话呢,本身排完序以后,相同的不就挨着了吗?那自然而然的话呢,我们这个性能呢,也会提升啊,这个一想大家应该能想明白这个事儿啊,那下边看例子。按照student ID呢,我们对学生这个选课呢,进行分组显示呢,不同的student ID啊和这个课程的数量啊,显示100个就可以了啊,因为这个情况比较多啊嗯,下边呢是这样子的,咱们把这个例子呢CTRLC一下拿过来。啊先粘过来,嗯,这个我就不用加这个了啊,你看这里边我把这个from呢往后移一下。针对我们这个叫student ID呢,我们进行一个group。啊,现在的话呢,咱们由于已经给这个三呢加了索引呢,相当于这时候我们要是演示的话呢,是它这个上边是不是有索引的一个情况呀。
19:03
啊,是成这样了,那咱们就先演示这个吧,OK,来,咱们走起。啊,大家看我们现在花费的是不是0.041毫秒啊,四一秒,那就相当于是花了41是不是毫秒啊,哎,这没问题,然后呢,我们在这上面如果要是没有索引的话呢,那CTRLCL一下。马上没有索引。那没有索引的话呢,我们需要把刚才这个索引呢,是不是给它删掉啊,啊这个我们讲一下,嗯,我们这样吧,咱明明也是先测的它啊。哎,这么着,然后在这儿我们去协商,就大家呢,你就照着我这个顺序呢,哎往下执行就可以了,这呢我们是删除这个叫。这个名的索引。删除索引的话呢,也是可以通过呢,叫table也可以呢,叫job index是吧?嗯,这个job index也行。嗯,起个名就他,然后呢啊,我们这个叫a student,是不是info这样一个表来选中。
20:02
执行可以了,然后再去做一个受,看一下是不是删掉了。那删掉了,好,那这时候没有索引了,然后我们再去呢,执行一下啊,没有索引的情况下呢,走起。好,大家看这个话了,是不是866这个毫秒啊,哎,866,哎,你看这个时间的话呢,能插出来一个这个数量级,哎,大概应该是20倍左右吧。啊,没问题。行,那这呢,我们就看到了这个有还没有是有区别的order by啊这样个情况,呃,Group by这样个情况,然后order by的话呢,大家应该也能够很好的去理解这个事儿吧。啊,如果是的话呢,也同样的道理,我就先布举这了,然后呢,我们接着再看这个情况,说呢,我呢和呢同时考虑的情况,诶同时考虑上,你比如说我呢,这写的叫student ID order by呢,我写的叫create time。在这种情况下呢,呃,咱们看一看什么问题啊,就是呃一方面啊,一方面的话呢,我们分别呢,给这两个字段呢,咱们去建立这个索引啊,这是一个情况是吧?呃,另外一个呢,我们建立一个联合索引,这个联合索引呢,针对的是我们这两个字段的联合索引,我先写它,后写它,然后我们还可以呢,再建立一个索引,也是联合索引,我们先写这个create time,再写这个student ID,那么这个情况呢,就会更复杂一些,那结论呢,就是我们写哪一个呢会更好。
21:24
是吧,哎,就是这样个场景啊,这个呢,测试呢,会涉及到这个索引呢,情况会复杂一点啊,然后我们再来看。啊,真的是这个再测试。好转过来,这里边的话呢,我们是有两个的,嗯,这块呢,咱们先说明一下啊,这个叫student ID,咱们目前的话呢,是不是上面没有缩引了。这个操作我老用,我就把它这个再粘一下CTRLC。嗯,先选中啊执行啊,就这一个对吧?行,那下面的话呢,我们去演,呃,这个演示一下啊,我是先造两个索引,一个是针对他的,一个是针对他的啊这两个的是吧,好的,那我们就。
22:06
哎,不是create了啊,这个al啊。嗯,这个我们叫添加索引。添加单列索引。嗯,好,这个alter一下这个table。啊,Student infer,然后index啊,然后呢,我们先针对的是student ID,然后这样写啊,Student。ID好,这是一个。走起来。需要花一点时间。所以呢,我们创建索引的话呢,大家你可以理解就是提前呢,咱们把这个时间呢给花了是吧,他底层呢,帮我们造了一个索引,然后呢,我们在查询的时候呢,你就可以直接用我们底层生成的这个文件了。啊,所以这个时间呢,相当于前置,就跟我们说这个缓存一样,你提前把数据呢,加到缓存里边了,像red是吧,然后呢,你这时候你再去查找的时候呢,从缓存里边去查,那自然而然的速度就会快一些啊,我们都就是你想让他得到相关的一些好处呢,都有前期的一些成本的投入的啊,生活中也是一样,对吧。
23:11
好,I的一个这个index啊,Index针对的是我们这个叫create一个我就简写了。哎,这么着。好,选中再执行。嗯,可以了,然后呢,我们去做一个受查询,诶这块我们就看到了,是不是有诶这两个是不是两个这个缩引我们就加上了,加上以后的话呢,我们去做一个这个select的查询啊来咱们走起。好,大家看这块儿呢,是不是报了一个错误信息啊。嗯,这个错误信息的话呢,说的意思就是由于我们这个circle目里边说only for group,由于我们里边circle目,咱们在前边这个第一章应该是讲到了,对吧,有这样的一个值,这个值呢,就限制了,说你这里边group by里边呢,你没有写这个create time order by呢,写它了,这个就不允许。
24:01
啊,它有这个限制,但是我们要写在这儿的话呢,这跟我们这个测试呢,是不是又又又违背了,对吧,那怎么办呢?那那咱们就这样吧,我去修改一下这个s mode。来修改mode啊,还记得怎么改吗?首先我们先查看一下啊,这个select,咱们叫mode,先看一下当前它的这个值啊,走起。好,大家会发现呢,是不是一上来就有叫only for group啊,那咱们这么着啊,我先把这个哥们呢先复制一下。然后呢,我们去set一下这个。嗯,咱们当前这个s mode,把这个值呢,咱们给它做一个修改啊,稍微有点长,那这里边呢,我们就把它的第一个呢,给它去了吧。这样的话就行是吧,好,我们选中了再去执行一下。嗯,可以了,那执行完以后的话呢,我们再去呢,跑咱们这个select的这个操作啊,走起。哎,稍微你看得花一些时间。出来了哇,这个时间挺长的,花了5.212秒啊,这个我写到这。
25:04
5.212秒行,那这时候的话呢,大家也可以考虑呢,我们去加一个这个叫plan啊,咱们后边呢,会讲去查看这个当前的这个执行计划,对吧。哎,叫。好,那这时候我们选中呢,走起来。大家你会发现呢,我们在当前这个查询语句当中,咱们有两个这个单列的索引,它使用的是谁呢?使用的是我们这个sid啊,就是针对这个字段呢去提供的,那有同学说为什么没有用我们这个字段呢?嗯,因为这里边我们所以的话呢,你要要么用它,要么用它只能选一个,但为什么选择是sid,因为我们讲过查询select当中呢,是不是我们是先走from,然后呢后边就走。BY了,然后再走order by,所以呢,你是先走的他后走的它,所以我们就先考虑呢,是用sid啊student ID呢进行了一个缩引。OK,相当于我们这个索引呢,是不是根本就没有使用上理解对吧?行,那么在这个情况下呢,咱们再去添加这个索引。
26:02
啊,这时候添加索引,大家应该能猜到我要添加是什么索引了,对吧,我们是添加一个叫联合索引。好,那么这个index,嗯,我们叫sid,然后再加了,再加一个。啊啊,这个叫time,然后这块呢,我们来一个这个逗号啊叫。哎,这个time好,再关注一个小细节,我这orderbi呢,这写的是不是叫DA啊,是一个降序排列,咱们在8.0中,咱们说到一个是不是降序排列的一个支持,那如果在8.0当中,大家你可以在这大点的大胆的去加个dic啊,因为你经常是以它来降序排列的,那如果说在5.7当中,你就加不加都无所谓了,因为加了也失效是吧?哎,就这样一个小细节,好,那这时候我们再选中执行。啊,说我们这个。Doesn't exist in table,我哪写错了?啊。哎,这个字段名呢,叫他,哎再选中。走起来。
27:01
嗯。哎,需要一个创建可以了,创建完以后的话呢,我们先去做一个show啊,记得查看一下,确认一下,我们当前呢,你看确实是有了,呃,Student ID和我们这个create time它是一,它是二,这个呢也很关键,然后的话呢,咱们再去做一个啊,这个我就把就去掉了,做一个查询CTRLC。走到这儿。来选中。啊,走起来。大家看同样的这些数据啊,我们查询了100行,他用的是0.257。啊,你看这个速度呢,差别是不是极大的呀,0.257啊秒,那这个呢,我们就能够看到呢,确实呢效率会更高,那你想再去验证一下的话呢,我们就可以使用一下,咱们这个叫执行计划啊。诶这么着,然后呢,此时呢,你看我们选中了做一个执行,当然你会发现呢,现在的话呢,虽然索引很多,但是我们最终呢,选择的这个索引是不是一个联合索引,我们先考虑的是这个student ID,然后在这个基础上呢,我们又使用一下这个叫create time,那它联合在一起呢,去查询性能呢,要更高一些,诶这个呢,明显的能够看到这个效果,好,我就把它就去了啊呃,那么在这个基础之上呢,咱们再去测试。
28:13
那再这个进一步,进一步的话呢,我们这样做,首先呢,咱们把这个索引呢,我给它删掉,有同学说老师你为什么删了它呢。嗯,先说我添加吧,我想添加一个这样的缩引。CTRLC。CTRLV这个,所以的话呢,我们先写这个。叫time,然后的话呢,我再去写这个叫嗯,Student ID。应该能明白我的意思对吧。好,逗号一下。哎,这么着行,那这样啊,我先创建一下当前这个索引。嗯,还没创建完。创建好以后的话呢,那我问大家,我们现在实际上有两个连索引,那这呢,我们去写一个这个explain。
29:00
对吧,那我写完这个plan以后呢,实际上呢,此时我们是有两个这个,呃,联合索引的。嗯,看这块呢,就更多了,对吧,你看这是一,这是二,那么这时候我们要用explain的话呢,问大家就是说它使用的是我们上边之前这个先使student ID后create time,还是用我们下边这个呢。啊,那么毫无疑问的话呢,我们用的是不是还是咱们之前的那个先是sid,因为的话呢,我们是还是先group先要执行它,所以先用它这个字段,再用这个字段,对吧,那么所以时我刻意呢造出来一个它,然后呢,你要这时候我们去执行就没有意义了,因为用的仍然是我们之前这个联合索引,所以呢,要想检验一下他这个情况呢,咱们必须呢要去照一下这个index。诶,Job index叫谁呢?就他呗。啊,然后呢,啊啊,咱们叫student。Infer对吧?把我们西s sid那个给他干掉啊,周期。好,删完了删的还挺快啊,删完以后的话呢,来问一个记录点,我现在呢再去做这个plan啊,我问大家你说我们会不会使用上这个索引,如果使用的话呢,用的是哪一个。
30:07
哎,看跟你想的一样不一样啊,走起。大家看此时的话呢,你看可能会使用的就sid,还有我们这个create和sid,但真正的咱们用的呢,是这个S,诶同A,为什么没有使用这个联合的呢?因为你想想我们要执行这个查询语句的话呢,咱们是不是先要go,那这时候呢,我们上来go呢,要使用sid了,随ID了,你这个呢,还没有用它呢,而我们现在确实有一个现成的就是以sid呢来构成的一个索引,那我们就优先选择用它了,就不会考虑这个结构。诶,这个呢,大家注意一下,那进而的话呢,你看我们此时呢,在有这个联合索引的情况下呢,我们再去做个查询。大家看一下这个时间。你看这个时间就少不了了,三秒多钟。啊是吧,三秒钟这个咱们嗯,再进一步这样删除,好,我把这个呢,再CTRLCL一下。哎,我放在这个下边花了呢,3.790。
31:01
啊,3.790行,那想要表达的意思呢,大家应该就很清楚了,就是如果说呢,咱们使用单独你要用格BY了,那么你就针对这个字段呢,去建立一个索引,那你要是逗,呃,这个逗号还有其他的,你可以建立联合索引,哎,BI呢也同样的道理,那如果说呢,既有groupbi又有BI,大家呢,可以考虑建立一个联合索引,那么这个联合索引呢,一定是要先把我们格拜中的字段呢写在前面,奥德拜中那字段呢,要写在后面,在8.0当中呢,如果你要尝试降去的也可以考虑呢。呃,经常降序,你也可以考虑建立这个索引的时候呢,是不是就把我们这个,诶联合索引在这儿呢啊。嗯,爱的A写哪了,哎,把我们这个D呢也加上在8.0当中,这个效果呢会更好一些,行,这呢是我们说的这几个点,然后呢,我们再往下看。啊,这个你看我都写了一个例子了,这块呢提到了说这个update delete中的这个where这个条件列啊,就是我们可以呢去做update操作,做这个delete操作当中呢,我们是可以去加V的,或者说通常咱们都加,因为你要不加的话呢,是不是就成了对全码中的数据的一个,呃,修改和删除了,一般都不会的,所以一般都会有where,那既然有where了,那我们就考虑呢,这个where中的这个对应的字段,我们是不是也可以考虑去加,所以呢,诶是可以的,举个例子,你比如说我们去修改这个C,这个信这个表中的信息,咱们呢,是把这个名字叫这个名的这个学生的ID呢改成他。
32:25
啊,有同学说老师你这个表中一定会有这个字段吗?有可能没有对吧,但是呢,没有他是不是也要把这个B加数全找一遍才行是吧?来我们此时呢,CTRLCL一下。来回过来啊,这个咱们先这样啊,把这个粘一下啊,CTRLC。那这样呢,是我们说的这个第四个点。带他啊。好,然后这块呢,我们把这个呢,CTRLCL一下咱们拿过来。来做一个测试,这个测试的话呢,大家注意先别着急呢,盲目的去测试,我们先要确保一下呢,我们不能够使用咱们现有表中的一些索引,对咱们这个数据呢产生影响,对吧?好,首先呢,我CTRLC一下在这块啊,查看一下咱们当前这里边这个索引的一个情况啊,走起。
33:08
好,这里边儿这个索引的话呢,我们看看有没有关于这个name的,那你看目前呢,实际上是没有的,那没有呢,其实你也用不着去删这些索引了,对吧,你就直接跑起来就行,来我们走起。哎,出来了,这时候我们花费的时间呢,是0.633。秒是吧?哎,在这标示一下0.633秒啊,那如果说我们这一块呢,嗯,你去查看一下,又没有什么索引呢,它其实就没有用啥索引了啊,因为咱这也没有上面有跟它开头相关的一些索引,对吧,那么在这个基础上呢,我们去添加索引。添加索引啊,我们去al一下这个table啊,这个student in for,然后呢,ADD的一个啊,Index。这个咱们针对的就是这个内幕字段,OK,没问题。选择执行。
34:04
啊,需要花点时间。可以了啊,然后呢,我们再去做一个受。啊,此时的话,我们看到有这个索引了,那接着的话是不是我们就再做一个查询是吧,那这个查询的话呢,我们是还是把它改成这个,这个你换一个吧,是吧,其实一样的道理啊,选中呢在执行,大家看此时我们花费这个时间是0.001秒,哇,这个时间呢,太快了。001秒,那跟我们这个0.633秒相比,你看差了600多倍。没问题是吧,好这个呢,大家就知道我们这个意思了,在我们这个update也好,Delete也好,我们的外当中,建议大家呢,把外中的这个字段呢,设置成这个索引的形式,那效率呢会有提升。诶对delete的话呢,效果如何呢?下边也举了例子了啊,这个我就不多说了,然后我们看这句话说对数据按照某个列呢进行查询后,再进行update和delete操作,如果对外中呢,创建了,诶这个字段呢,创建的索引能够大幅的提升效率。如果进行更新的时候,更新的字段,诶你看这句话呢,其实也很好理解,咱们更新的字段呢,是非索引字段,那提升的效率呢,会更明显。
35:08
那因为呢,我们更新的这个字段呢,根本也不需要呢,在索引中进行维护了,所以效果呢还能好一点,省去你去修改那个索引的那个过程,对吧。好的,哎,然后这呢是我们说的第四个点啊,咱们这儿先停一下。
我来说两句