00:00
好,咱们接着来讲这个索引,那我们该讲这个第八章,呃,叫做索引呢创建与设计原则,那么这一章里边呢,我们主要呢,分三块内容啊,来给大家进行讲解,第一块内容呢,就涉及到我们关于代码层面呢,如何呢去创建索引,包括呢,如何去删除索引,这个是代码上的一个体现。那么第二部分内容呢,我们来讲讲在MYS8.0当中索引的这个新特性,那就意味着我们5.7呢就没有了,对吧?首先呢,就要支持降序索引啊,其次呢,我们还可以支持这个索引的一个隐藏功能啊,Invisible是吧?好,那这时候啊,我们诶讲到这个第二点的时候呢,我们再说具体的这个内容,第三个内容呢,叫做索引的设计原则。啊,这里边儿我们就提到了,在哪些情况下呢,适合给这个字段加索引,哪些情况下呢,不适合给这个字段呢加索引。啊,因为有的同学可能会想到说,所以啊,它的主要目的呢,不就是诶作用在我们相关的这个字段上,让我们在比如说查询数据的时候呢,提升查询的一个效率嘛,哎,没有错,这是我们说索引的一个核心,那既然如此的话呢,我们是不是见到字段你觉得顺眼的话呢,就给它加索引啊。
01:07
那其实不是这样子的,因为在有些情况下呢,我们要是加了,所以呢反而适得其反啊,那这呢,就是我们这个第三节呢,要给大家讲解的这个内容,那这块呢,其实也涉及到了,就是我们关于索引的优化了,就是大家呢,在实际开发当中要遵循这样的一些规则啊,这个呢就使得我们的查询效率呢会更高,那这呢,就是我们这一章呢,主要给大家讲的三个事儿,那咱们首先来看第一个事儿,关于索引呢,该如何去创建。那说到索引的创建啊,首先呢,我们得先弄清楚,所以呢是怎么分类的,呃,因为这块呢,就直接影响了我们接下来呢,对于索引的创建了。那么所以应该如何去分类呢?啊这个呢,诶我们从不同的角度来给它呢进行划分,诶我呢是从这样的三个维度上去划分的啊大家看看是不是有道理啊,首先呢,从这个功能逻辑上去划分的,我们说索引呢是有四种的,那我这儿呢,列举出来了四种,OK,这个分别对应的叫普通索引,唯一索引,主键索引,全文索引。
02:07
OK,那有同学可能说,诶老师你怎么没有列这个叫空间索引呢,那空间索引的话呢,使用这个special来修饰的这个呢,因为我们不同的这个存储引擎啊,它有的支持,有的不支持,所以这块呢,我就列举出来的是我们这四类呢,比较通用的这个从功能逻辑上呢,进行划分的这个场景,那具体细节呢,咱们一会儿再说,那么从这个物理实现方式上来讲呢,分成了两种,一种呢叫做聚数索引,一种呢叫做非句数索引。我这一说呢,大家应该都能明白对吧?物理实现上咱们说呢,诶主键对应的这个索引呢,我们叫做句子索引,而且它直接是不是就决定了我们数据的存储的方式了,底层呢,也对应到那个ibd文件里边了,是吧?诶句组索引啊,非技术索引,我们平时呢,也称为呢叫二级索引,OK,那么按照这个作用字段的这个个数进行划分的话呢,我们可以分成呢,就是你作用在单列上的叫单列索引,作用在多个字段上呢,我们叫做联合索引。
03:00
啊,这个很好理解对吧,我们前面讲那个非句子索引的时候呢,下一个内容呢,是不是当时我还说过这个联合索引啊,而且呢,说他俩呢,不是说是没有,呃,这个完全割裂的啊,那它们其实是有这种互相的融合关系,你比如说我们这块呢,定义的一个字段,再一个字段,它俩呢联合在一起。啊,构成一个索引了,这就叫联合索引,那如果你这两字段呢,就是普通的字段,那其实它就是个非局促的,你要是这两个字段呢,合在一起是一个主键了,那对应的是不是就我们句促索引啊,哎就是这样个道理,行,这儿呢是从不同的角度呢来进行的划分啊,我觉得我这个话的还是比较清楚的,之前呢看了很多的,这个也是一些不同的地方,关于讲索引这块呢,始终呢没有把这个事儿呢说透啊,这个呢明确啊,我这块呢,诶声明出来啊,三个不同的角度。然后呢,下边的话呢,咱们,呃,这个分别呢,把上边里边的一些索引啊,它是什么意思,大概什么情况,咱们呢,给大家做一个交代,首先第一个呢,叫做普通索引啊,普通索引就是比较普通啊,就是没有任何的附加条件,比如说我们在一个表当中,咱们呢,针对某一个字段,这个字段上呢,它也没有什么,呃,就是从类型上来讲,没有特殊的讲究,说能用什么不能用什么是吧,从这个约束上来讲呢,他也没有什么特殊的约束,就是一个很普通的一个字段,那么针对于这个字段呢,我们上边加了一个索引,那它就是一个普通索引。
04:18
可以作用在任何数据类型当中,对吧,也没有要求你是非空啊,唯一啊这样的一些点没有要求啊,就是这样的,哎,特点是吧,比如说我们在这个student这个表里边的name字段上,我们加上一个普通索引啊,那此时呢,当我们查找数据的时候呢,呃,通过where数where这个字段进行查找,就能够提升我们查询的一个效率。好,这个呢叫普通索引,那么唯一性索引啊,这个一看到唯一性呢,咱们前面是不是讲过唯一性约束啊,那跟他呢是有相关性的,咱们前面也讲过,凡是声明了唯一性约束的这个字段,自动的会添加一个唯一性的索引。对吧,哎,添加微性索引,而且咱们讲上篇的时候还提到,我们想删除这个微性约束的时候,是不是就通过删除微信索引的方式呢实现的,对吧。
05:03
啊,不知道大家这我一说还有没有这个共鸣啊,还能不能回忆起来好,那么这个唯一性索引的话呢,顾名思义就是我们这个,呃,这个你声明在某一个字段上,这呢是一个表,在这个字段上呢,我们给它加了一个唯一性索引,那么这时候这个字段呢,要求它在赋值的时候呢,这个值得是唯一的。对,得是唯一的,相当于是有一个唯一性约束,对吧,那就是这样的道理,那一个表中呢,你可以声明多个唯一性,所以啊,这没问题。比如说我们这个student这个表里边这个email这个字段,那我们就给大家声明一个啊叫唯一性索引啊,当我们通过email呢去查询的时候呢,呃,首先呢,从索引的角度呢,会提速,从这个维性的角度来讲呢,这个呢是不可以有重复值的,那这个好处呢,就是你想象一下我们这块呢,就是这个具体的这个加数了啊一个呢,节点就是一个页,那比如我们想找呢,是叫ABC,那这样的一个字段值,一旦呢,你在这个叶子节点中找到ABC了,是不是就没有必要呢,再去后边去找了。啊,对吧,那因为呢,它是唯一的,找到一个呢就停止就可以了,好这个呢叫唯一性索引,然后下边这个呢,叫主键索引啊这呢,我一说大家其实也。
06:08
不用我多去讲吧,那就是我们在这个主键上,咱们前面讲约束的时候提到过主见,主见约束上呢,自动的就会有这个主见的缩引叭较特别,它不光呢是有这个有内的约束,还有这个no no的一个约束,对吧?这就主见约束的一个特征,那一张表里边最多只能有一个主见索引啊,因为呢,一个表中最多只能有一个主键嘛,主键索引呢,其实就我们所说的是不是叫聚促索引嘛。对吧,哎,这样啊。呃,那下边说,呃,为什么说这个逐渐索引只能有一个呢?呃,这个应该不用多讲了,因为我们就只有这一种存储这些数据的方式,你不能把这个数据呢,给它割裂开了,也不可能呢,给它存两份是吧?诶,那我们就按照这个主键索引来存储的啊,决定了底层的物理实验方式,所以呢,只能有一个啊。好在下边什么叫单列索引啊,这都懒得说了是吧?啊,就是作用在一个字段上的,这叫单列索引,那一个表呢,可以有多个单列索引啊,没问题,下边呢,叫多列索引,或者叫联合索引,或者叫组合索引,都是一个意思啊,作用在多个字段上的,对吧?哎,这样你比如说我们这里边创建了个索引啊,这个呢,我们起名字的时候呢,尽量呢,咱们也要见明之意,那一看这呢就是个索引啊,它作用在呢,ID name和这三个字段上的。
07:20
那我们这样呢,建了一个叫联合索引啊,这里边儿呢,呃,关于这个联合索引的一个使用啊,我们建索引的目的呢,是不是就希望在查询的时候呢,能够使用这样的一个索引,对吧,那你怎么能使用呢?这里边提到了一个原则,叫做最左前缀原则。啊,最左前缀集合啊都行,这个咱们呢,诶后边呢,还会给大家去讲啊,咱们先知道这么个事儿啊,后边再展开具体说。好,那么这这呢这块呢,提到一个叫全文的一个检索啊,全文检索也称为呢叫全文的索引,是目前搜索引擎的一种关键技术,主要呢,使用这个分词算法啊,分词的这种算法啊,那这块呢,具体的来讲,这个有呃什么样的这个索引方式啊,有自然语言的这种全文检索,有布尔的全文检索啊,这有检索的具体方式的,诶我们使用这个叫for test来进行这个全文检索的一个设置啊,全文啊还检索一个设置,这个你一看这个名字的话呢,全文检索那那就决定了它比较适合的就是大型的这个数据集,对于这个数籍比较小的话呢,它的用处呢,其实是诶发挥不出来的啊,这个注意一下,那如果我们查询数据量比较大的这种字串啊,这个字段的时候呢,我们使用这个全文检索呢,可以提高这个速度。
08:33
啊,具体这种做法呢,你比如说这个自然语言这个搜索引擎当中,咱们呢,就会把比如说一个一段文章一段文字吧,你比如说这段文字,这段文字当中呢,我们会使用分词的技术呢,把它分词,分词完以后的话呢,我们找那种出现次数相对比较少的词,相当于得作为这种关键词,然后呢,这个给它做相关的这种匹配啊,那对于这种出现次数比较多的词呢,反而呢,我们倒不是特别的关心,你比如说我们在这种分词当中呢,见到这种我呀的呀,还有那些语气词啊,是我们就不是特别关心了,对吧?哎,是这样的点。
09:06
啊,那具体这个细节的话呢,咱们就不多去讲了啊,一会儿创建的时候呢,咱们到时候可以举例啊,说一下这个如何呢?去创建这个全文检索啊,全文索引。那么这个从呃,这个是关于它这个版本的一个迭代,在这个MYSQL3点几的这个版本当中开始支持这个全文检索,呃,这个5.6的是5.6以前呢,是只有MY去支持,5.6以后,那意味着我们现在呢,比如说使用率比较高的5.7,包括8.0,相当于印度DB呢,也都开始支持这个,呃,这个全文检索了。啊,这个,但是官方呢,不支持这个中文的分词,需要呢,我们再引入的第13方的这个插件啊,那么在5.7.6,刚才说的是5.6啊,在5.7.6这个版本以后呢,内置的一个叫NGDR这样的一个全文解析器来来支持呢,像我们说的这个中文的这个分词啊,当然这块呢,我们只是做一个整体的介绍就行,因为呢,咱们现在在实际开发当中,比如我们在这个京东啊呃,在这个淘宝啊等等是吧,各种各样的这个商城的这个页面当中啊,我们会发现呢,咱们检索数据的话呢,更多的是不是使用的这个叫搜索引擎啊,像sor啊,像ES啊,诶这个呢,是我们目前的一个主流,咱们呢,可能就直接在MY当中进行全文检索的这种方式呢,就比较少了。
10:18
啊,虽然说他给我们提供这样功能,但我也不一定非要用它啊,OK,然后再者呢,给大家补充一个叫空间检索,咱们在讲上面的时候呢,提到数据类型,当时呢,是不是提到过一些,这叫空间数据类型是吧?诶空间数据类型啊,有这么几个啊,当然还有其他的一些类型啊,那么如果说我们作用在这些类型的字段上的时候,我们就可以呢,给大家去设置呢,叫空间索引啊,用这个参数呢,叫special,呃,空间的意思啊,空间索引呢,只能够作用在我们这个空间的数据类型上。那那我们呢,呃,这个在你进行这个查询操作的时候呢,我们这个就可以帮你去提升这个查询的一个效率啊,这是这个情况。好,那么小结一下,那我们提到关于不同的存储引擎对这个索引的支持,那印度DB呢,B支持for检索,支持不支持哈希的啊哈希索引前面我们也说过是吧?MYS呢,跟我们这个印度DB呢是一样的啊,Memory的话呢,是都支持,诶默认的话呢,诶这两个都支持啊,默认的话呢,它是哈希索引,它不支持这个全文检索。
11:19
啊等等啊,下边呢,大家了解了就行好,那么关于这个呃,索引的一个分类啊,它的一个具体的功能啊,我就说清楚了,然后接下来的话呢,我们去讲解如何呢,在代码层面呢,去创建索引。
我来说两句