00:00
好,那通过刚才呢,我们这样一系列的这个推演和迭代呢,咱们又得到了一个比较经典的B加数的一个结构啊,就是我们看到这样的一个结构啊,这儿呢,我把这根线呢又补充上了啊,因为这里边的所有的图呢,都是呃咱自己画的啊,所以这块呢,补一根线呢,就非常的简单了啊,这所有的图呢,我都是在这个process on这里边呢来绘制的,哎,大家你会发现呢,我们未讲这个高级这个课程的话呢,你看我们绘制的图呢,是非常多的。啊,所以大家呢,也是随着想更新这个高级呢,都是可以理解的,当是一个好课的话呢,确实是需要不停的去迭代的啊好,这里边需要做很多细致的工作啊,大家呢,可以打出一个666啊支持一下是吧?好那这块呢,我们回过来,呃,这个图的话呢,大家作就作为一个经典的啊,理解毕加树这个结构的一个图啊回头呢,看到呢,类似于这样的结构里边的些细节点的话呢,呃,一致那就是一个标准的B加数啊,如果不一致啊有些问题,那这个B加数呢,它可能就是有错误的是吧?诶注意这样的一个细节,好那么基于我们讲解的这样一个结构啊,咱们来看一看常见这个索引里边的几个词啊,那为了方便起见啊,我这块呢,就把这个图呢,咱们截一下。
01:08
啊,方便呢,咱们下边来进行一个说明啊,我就哎这么大吧,那下边呢,我们来看一下索引的这样几个概念啊,那几个概念的话呢,分别对应的叫做句数索引,非句促索引啊句促索引呢,其实我们刚创建的这个呢,就是一个句促索引,就是针对于咱们主件。构建的这样的一个呃索引,或者叫一个被加数,那我们就叫做句组索引,那么针对于这种非主件啊,构建的这种索引呢,我们就称为呢叫非居组索引,也可以称为呢叫二级索引,或者叫辅助索引。啊,然后呢,基于我们讲的这两个概念呢,我们再来谈一谈什么叫联合索引,那其实联合索引呢,也属于这个二级索引,或者叫非聚速索引啊行,那我们来先看一看这个句子索引,也就是呢,对于我们刚才呃,迭代以后呢,生成的这样的一个索引结构呢,我们进行一个再次的说明。这里边儿提到了,说句子索引呢,并不是啊,一种单独的索引类型,而是一种数据存储方式啊,因为呢,所有的用户记录呢,都存储在了我们的叶子节点上,诶大家你看我们这个表中的记录啊,是不是都在这儿,有同学说,诶老师都在这儿了,那我们表里边还存什么数据啊?诶这个问题要问出来以后呢,其实是有点幼稚了。
02:21
咱们呢,在查询的时候呢,呈现给我们的是不是这样的一个表的情况,对吧?那么在底层我们物理磁盘存储层面上来讲呢,它就得需要呢,具体的物理磁磁盘存储的这样一种方式了,或者叫数据结构了,那什么数据结构啊,就是咱们这里边讲的这种比夹数的结构,那也就是呢,我们这里看到这个数据啊,就是咱们的表中的数据的底层的存储方式了,那这个被加数里边啊,存储了我们核心的这个数据啊,而且呢,还方便我们去做查找,这个呢,就是一个索引,对吧?那这个索引呢,相当于里边包含了数据。啊,数据呢,融合在我们这个索引当中,你中有我,我中有你,所以呢,我们这个句子索引呢,呃,就有这样一句话叫索引及数据,数据即索引。
03:04
能理解这样一个概念吗?啊,我们这是一个索引,里边是不是有数据啊,数据呢,是不是就对应的这个结构就是一个索引结构啊,啊大家你想一想,我们在这个DB当中。啊,咱们前面呢,讲的那些底层的文件结构啊,那都不能白讲的,对吧?在in DB当中呢,咱们是不是有这个叫ibd这样的一个文件呀,不管你是5.7还是8.0当中,咱们都有这个ibd,对吧?那这个ibd呢,咱们不就是说数据和索引是合一的吗?诶都在这里边,而我们这个MYS啊,还有印象吧。咱们这个MY当中呢,咱们是不是说到这个Di啊,因为呢,你看它这个索引跟我们这个数据呢,它是不是就分开的啊,这个呢是怎么回事,咱们一会儿再说啊,它呢,其实里边是不包含这个句索引的,而我们in DB这种啊是包含的啊,那包含的特点呢,就是索引及数据,数据及索引,所以呢,索引和我们数据能看就只有在一个文件当中。啊,这呢,就跟我们前面内容呢,我们就能连成一片了,对吧。
04:01
那这个术语聚数,它表示的就是数据行和相邻的这个间值,句数呢,它存储在一起,就是我们这里边这个表中的数据啊,跟我们这里边这个索引结构呢,哎,它是一个整体的,那非句子索引呢,它里边是不存储我们这个表中的一条一条记录的啊这个注意一下。好,那这个呢,我们就说清楚了,然后呢,我们针对这个表中的一个特点呢,做一个说明,那就是大家呢,回头看到一个,呃,这个树形结构,说这是不是一个B加数呢,咱们去区分呀,诶大家这样来看,那首先的话呢,你可以先来看一下我们的底层的这个位置啊,这个我们叫数据页了,这里边呢,呃,存储的你看呃,这个咱们说呢,不管是一个B加数了啊,B加数呢,相当于分成了叫聚数索引和非聚子索引,咱们现在呢,先看一看什么叫这个聚数索引啊,这个聚数索引里边呢,它的叶子节点存储的都是我们的实打实的一条条的记录。啊,一条条记录,然后呢,记录跟记录之间呢,是一个单项列表的一个结构啊,当然呢,这里边儿呢,咱们针对这个主键呢,进行的一个声序啊,进行的一个添加,它就是一个升序排列的,你看是不是一个声序的。
05:05
嗯,下边呢,就是你这个非主见的这些这个数据值了啊,就是整个呢,构成就是我们表中的所有的记录,包括一些隐藏的列呢,都在这里边。好,那么这个数据页跟数页之间呢,是一个双线链表的一个结构啊,这个呢清楚啊,然后呢,呃,下个页中的这个主键值都比上一页这个主键值呢要大啊,这个一个页之间呢,也是一个啊生序,然后呢,我们接着呢去构建的这个叫呃目录像啊构成的这个页啊,你可以叫目录页啊,这我们也可以起个名字,那么这里边的话呢,也自然而然的是一个生句的一个关系,这个一呢,就是我们第一个这个页当中的这个主见的一个值是一,然后下边这个十呢,指的是我们这个页码十的意思,那其他呢也同样的道理啊,这个我就不用多说了,然后呢,一旦我们这个目录页呢多于一个呢,我们就要在它的上层再构建一个新的目录页。啊,这个呢还是这个一,然后30呢,指的是我们这个页码30了,啊这个呢320,然后下边这个页码呢,指的是我们这个页码呢,叫32。
06:03
哎,这个呢就称为呢,叫一个句促索引啊,我现在呢,就把这个句促索引的这个特征呢,就抛给大家了啊中间这块看也是双眼列表,OK好嗯,那么呃这个呢就完事了是吧?把这种特征呢,我们就称为呢,它是一个聚促索引,那一会呢,我们再看一下,同样是一个被加数非句子索引呢,是长什么样子的啊一会咱们再说。那么在咱们这个聚促索引当中,这个叶子节点中放的就是我们实打实的一条条的用户的记录啊,相当于表中的一条条的记录啊,大家看这句话说这种句速索引并不需要我们在MYQL语中显示的使用index语句去创建in DB呢?存储引擎会自动的为我们创建句速索引,为什么呀?为什么呀啊,因为你想我们这个表呢,刚建立的时候呢,假设这个空表一旦呢,你往这个表中去放数据的话呢,是不是我们就得是底层去创建这个B加数啊。啊,而且呢,不需要你自己去创建,你只需要呢,在这里边去添加数据就完了,诶你这块添加数据的过程当中,我们自动的就把这个比加数呢就构建起来了,而不是什么呀,不是说呢,我们把这个数据呢都加完以后,然后呢说哎呀我们忘了添加索引了,我们这块呢,创建一个句子索引,诶然后再创建出来,那就晚了,我们在添加数据的过程当中啊,你这个底层的这个B加数就已经构建起来了,不需要你再造完表,添加完数据以后呢,再去显示的去造一个缩影,那就晚了是吧,黄花塞都凉了。
07:28
好这呢就是这个意思,然后下边的话呢,我们看一下这种结构的一个优点是什么啊,说白了这个句子,所以呢,就是针对咱们主键来搭建起来的这样的一个笔加树,哎,特点呢就是访问速度比较快。啊,因为呢,我们这个数据呢,你看跟我们这个在想要查询的时候,如果你要通过主件呢,去查询数据呢,也在我们这个表当中,所以呢,诶就直接呢就查询到了啊非常的方便,相较于我们非技术索引呢,它里边是没有存储这个表中的一条条记录的,那查询查询起来呢,它还得需要呢一个回表的操作啊,一会儿我们说什么叫回表。
08:02
然后的话呢,我们这个句子索引呢,对于主键的一个查找,呃,排序查找或者范围查找速度很快,你比如说我们现在想查询大于12的这个数据,那这个C1啊,诶大于12的数据,那直接呢,你就从这个12呢,后边这块去找,不就是比它大的嘛,本身呢,它已经有序了,所以对这种排序查找或者范围查找呢,那个速度呢,它自然而然就会很快。好,那么按照去处索引呃,排序的这个顺序呢,我们查找一定范围的时候呢,比较有优势,因为它都是紧密排列的,不需要呢不同从这个多个数据块中呢,去提取了,节省了大量IO的一个操作,这个呢,其实就是我们构建索引的一个优点嘛,就是减少IO操作的是吧?诶这个呢很好理解,那么我们这个句子索引它有什么缺点吗?诶大家来看。它插入的速度严重依赖于插入的顺序,那按照主键的一个顺序呢,插入是最快的方式,那你看我们构建的时候呢,这个主键就是升序排列的,那如果我们再添加数据的时候呢,你这个主键呢,呃,添加了一个100,添加209啊添加到320以后呢,我们再加了一个200,那200呢,就处在这个和这个之间,那我们就放在这儿,但是你这个页呢,都放满了怎么办呢?是不是把300还得移到后边,然后这个呢,往这后移,这个往后移把这个改还得空出来,那这块呢,诶改完之后呢,有可能我们上边这块呢,是不是还得需要去更改这个目录页的这个项啊。
09:17
啊,那这个目录项呢,如果是第一个位置还得跟着改上边这个结构,所以呢,我们这时候呢,修改就非常的麻烦啊,建议大家呢,去插入数据的时候呢,我们就不要呢,就是或说白了就是我们尽量的插入数据的话呢,你不要动那个主键值是吧,让主键呢是一个自增的顺序是最好的。好啊,再一个点的话呢,就是主键呢,我们一般呢,也不要去更新它啊,你比如说我们把这个209呢,你更新成了这个呃409了,那显然的话呢,这个时候呢,它是不是就得蹦到这块了,哎,那又不合适了。啊诶,所以尽量呢,我们不要更新这个主键值啊,再者说这个二级索引呢,他访问呢,需要经过两次查找啊,第一次呢找到这个主键值,第二次呢,需要根据这个主键值呢,去找到我们这个行数据,诶这个二级索引呢,我们到下边时候呢再说。
10:03
那再说啊好,那具体这个限制的话呢,那我们看一看,说这个MY中的这个in DB当中,它是有这个句子索引的,MY里边是没有的啊,我们刚才也提到过啊,一会儿呢,我们再具体讲MY。好,那么由于呢,我们物理数据存储的排列方式呢,只有一种,所以每一个MY库呢,只有一个句子索引啊,一一般呢,就是由我们这个表的这个主件呢来构成的。啊,那么很自然而然的就是这样一个意思是吧?诶我们存储数据的话呢,就有一个这个结构给它存储起来就行,这呢就是我们说的居住索引啊,一般都是用主键来构成的,那如果我们要表中没有定义主键怎么办呢?哎,或者先说这个事儿吧,咱们来说只有一个句子索引,那咱们在上一章啊,在上篇中讲这个主见的时候呢,咱们是不是提到过说一个表中那个主见呢,是不是最多呢,只有一个呀。哎,那这块呢,就跟我们这个只有一个居组索引呢,他俩就吻合了,诶我们提供了一个主键,那我们就按照这个主键呢,去搭建我们这个,诶居组索引这个B加数啊,存储我们这个表中的这些数据。
11:02
啊,你要造俩主键呢,那不乱套了吗?俩主键那那那个句子索引到底按照哪个主键去操作呀,那就乱了是吧?所以一个表中不可能有两个主键,那既然呢你是最多有一个,那是不是有可能是零个呀,那如果我们要是没有定义主键的话呢,一度DB呢,会自动选择一个你这个表中的字段,看哪个字段上面呢是非空啊,且有一个唯一索引的,那我们就拿这个字段呢去替代你这个主键。啊,用这个字段呢,去构建这样的一个B加数作为句出索引。啊,作为句索引,那如果说我们这个表中没有这样类型的这种字段怎么办呢?度DB呢,会隐式的帮我们去定义一个主键啊,来作为这个居组索引啊,你可以理解成是一个隐藏的一个列,然后来满足这个主件的一个非空且唯一的特征,哎,帮我们去搭建这样的一个哎居组索引,来存储我们表上的数据。那刚才呢,我们提到了说这个主建呢,尽量我们不要去呃这个呃插入这个数据,也不要去更新它,呃尽量呢让它就维护一个自增的,所以我们在造一个表的时候呢,主件这块呢,我们通常是不是叫auto呀,大大家呢,就不要呢,用比如说像UID啊这个MD5加密的方式啊,哈希的这样给他算法混乱一下啊,或者一个诶没有意义的字符串啊,诶这样呢去充当我们的主见了,因为我们没有办法保证它是顺序增长的。
12:21
啊,那你就不会出现说一次往这块去排了,而有可能是来回插入啊这样的方式,那我们维护这张,诶这个所以呢是非常困难的啊好大家清楚这个事儿行,那么接着的话呢,我们来看第二个概念,叫做二级索引,在一个表当中啊,只有一个居数索引,但是可以有多个二级索引,或者叫非居溯索引。这里边涉及到点呢,就是说我们如果呢,要通过这个表中的这个主键啊C进行查找的话呢,我们就直接使用这个句式索引就OK了。那如果说我们基于的是这个非主键这个字段进行的一个查找,那我们就需要依赖于其他的这个索引了,你比如说我们想通过这个C2这个列呢,作为一个数据的一个查找,那怎么办呢?我们就可以基于这个C2这个列呢,我们构建一个索引啊,构建一个B加数,那这个B加数呢,我们就称为呢,叫二级索引,或者叫非聚簇索引啊,非聚簇的意思呢,就是我们这个表中,大家你看这个叶子啊,这个叶子节点。
13:20
这个叶子节点当中,它存储的不是我们这个表中的完整的记录了,它只是记录了一下我们这个C2这个字段的值,和你这条记录当中C1这个字段的一个值啊,你看这个是二,20,这个是三,这个是五啊,大家你可以去上面去找的对吧。我们找到找到这儿。找到呢,我们这个C2呢是二,C2是二啊你看这个C1呢,对应的不就20嘛,然后C2是三的时候呢,我们这个C1对的就是五,诶就刚才我们看到的实际上就是我们这个,呃,里边对应的这两条记录里边这个C1和C2这个值,那我们基于这个C2呢,构建的这个被加数,那自然而然的诶,我们就按照这个C2呢,是不是一个升序呢来排列了。
14:01
生序的没问题对吧?然后呢,你再把这个C2里边对应这个,呃,这一条记录中这个C1呢,你再列出来就行,注意这里边是没有C3的,那如果没有C3,那这块呢,你可以考虑这个B加数呢它诶要是的话呢,顶多是一个二级索引了,它不可能是居住索引,哎通过这个叶子阶点大家去区分是不是居促OK,然后呢,你再把这个数据页当中,哎,再往上去提取这个目录的时候呢,跟咱们前面讲的思路呢,就一样了,找到这个里边最小的这个是二二放到这儿,然后呢,这个页呢是34啊,那我们就把这个页号呢放在这儿,其他呢也同样的道理,一旦要多于一个目录项的目录页的话呢,我们就再构建一个上层的目录页。把这二呢放在这儿,然后这个页呢是42,我们就放在这儿,对吧,然后这个呢是九,然后这个是43页,我们就放在这儿,哎,就是这样一个道理。好,这个呢,我们就称为是一个,哎,由这个C2这个字段呢,构建的一个,呃,索引我们称为呢,叫二级索引。啊叫二级索引啊,中间呢,像这个单链表啊,呃,双向链表啊,这个结构呢,跟我们前面讲的那个句式索引呢,是一样的啊是一样的,好那么在这种场景下呢,比如说我们现在要找一个找一个值,假如我们想查询一下,说这个C2这个值是四的记录是什么,那大家看应该怎么去查找呢?
15:18
是不是首先过来之后呢,我们看这是二,这是九,那这个呢,最小的是九了,所以我们是不是得应该从这里边去找了,这里边儿呢,找这个四的话呢,你看呃,比这个二呢要大啊,那这有可能,然后这个呢恰好还就是四。那我们是不是这个里边也有可能啊,也有可能也有四对吧,所以接下来的话呢,我们有可能是从这个呃页里边和这个页里边呢去找,然后在这里边找到,找的时候呢,还是用这个二分法哈,诶这呢就找到了一条记录,然后在这里边呢,我们找到了两条记录,那假设呢,我们现在呢,是这样的一个SQL语句,我呢叫做a select星a from。哎,我们这个表,然后Y2呢AC2等于四,那么我们要找的是星星呢,是不是就C1 C2C3这三个字段值量都要列出来,但是呢,我们这个啊B加数当中是不是只有C1和C2,没有C3呀,那怎么办呢?啊那怎么办呢?但是你看我们通过C2是四呢,我是不是找到C1是一啊,然后呢,拿着这个一呢,我们是不是接下来呢,再去找咱们那个上边的那个句促索引啊。
16:19
哎,找到基术作引那个C1,你看呢,再找到你底层那个数据页里边,你看C1C2,然后呢,AC3是多少,然后同样的道理呢,你再找我们这个C1是4C是十的啊,这个数据再回到咱们那个上边提到的那个句数,所以当中去做一个查找。那那也就是说呢,我们找这个C24的这个数据呢,必须要是不是再回到我们居数索引里边去做一个查找啊,那么把这个过程呢,我们就称为呢,叫做回表。哎,就称为叫回表,相当于呢,我们此时的这个查找呢,就必须呢,要实现一个回表的操作,OK。啊,这就我们说的这样一个概念啊,我们要查找两颗是不是比加树啊,那有同学会问说为什么我们还需要一次回表操作呢?直接把完整的用户记录放到我们这个叶子节点中不就OK了吗?诶,这个叶子节点指的就是我们这个二级索引的这个叶子节点,相当于我们想在这个位置上是不是再补一个这个C3呀,那这个事儿呢,靠谱吗?
17:13
啊,显然不靠谱,为什么呀?啊,我们这个表中呢,只有三字段是吧?那要有四个字段,十个字段,那是块,是不是就意味着你要把这个字段都摆到这儿了,那相当于我们这个二级索引里边呢,这个叶子节点又完整的存储了一下表中的所有的记录了,那你想一想,我们这个表的话呢,只有一个句子索引,可以有多个二级索引,那假假设咱们有三个二级索引嘛,一个居住索引,那每一个二级索引里边都存储一份完整的表记录,那我们这个表记录在底层一共存储了四份,那不乱套了吗?冗余得多大呀,对吧,你说我们这个表呢,有呃1000万条记录,那你有四份1000万条记录,那何必呀。啊,不行是吧,太占据存储空间,我们呢,只在这个计数索引当中,咱们去存储这个表中的记录,二级索引中不要记录啊,那所以说呢,因为你没记录,你要想查询其他字段的话呢,是不是一定要回到句子索引中再去找,那就一定需要呢汇表对吧。
18:06
好,那这呢,我们总结一下的话呢,就是一个一动DB存储引擎对应的这个底层当中啊,我们只有一个主键对应的这个主键索引,或者叫主键索引,就是我们说的这个居住索引了,对吧。然后呢,当然这个你要严格的说呢,还有点区别,就是一个表中可能没有主见啊,那我们这块呢,就刚才上面也说了一个选择方式啊,总之呢,是不是只有一个居束索引对吧?然后呢,你可以呢,使用其他的字段呢来构成,呃,作为这个索引出现,那构成呢就叫做二级索引。啊叫二级索引,在去数索引当中,我们存储的就真实的是你这个表中的记录了叶子节点中,而我们这里边二级索引这个叶子节点中不是它是这个你当前按照哪个字段呢进行构建的这个二级索引啊,它呢,再加上我们这个主键的这个,诶这个字段是吧?诶构成的。好,嗯,那这儿呢,就是有一个关于句索引和非句索句促索引的个原理的一个不同啊,这个呢,应该就不用多去啰啰嗦了啊,大家应该能看明白啊,都能看明白,只能有一个句促啊,读个非举促啊,这个点看一下说如果我们使用居素索引的时候呢,数据的一个查询效率呢要高一些啊,因为咱不用回表了,对吧?但是呢,对于数据进行插入删除和更新操作的时候呢,效率呢会比非句子索引呢要低。
19:20
这个大家能理解吗?啊,要低啊你想想如果呢,我们现在呢,比如说是做一个update的一个操作,那我们update谁呢?咱们update的那个C3那个字段。啊,我们通过比如说C1啊,找到这个值,找到那个对应的数据,我们改一下这个C3,你想想我们这时候呢,针对于刚才咱们创建这个C2字段的那个二级,所以咱们需要去改这个数以吗?根本就没有影响到它,咱们只需要呢,是不是改你那个句子索引中的这个数据就可以了,是吧,你像这个都没改这个改了,那显然效率的不一样嘛。哎,那你这个呃,就所以呢,这个在进行这些操作的时候呢,效率就要低一些啊,因为它要涉及到底层的一个数据了啊。好,那么接下来的话呢,我们再来谈一个概念呢,叫做联合索引,严格上来讲呢,联合索引它就属于非居俗索引,你想想我们定一个东西呢,说这个叫居住索引,这个叫非句子索引,你把是他和非塔都已经概括了,那就不可能再有第三个概念了。
20:13
啊,那这个呢,其实就属于这个非居数索引,那为什么单独再讲一下它呢?哎,在有一些场景下呢,我们需要呢,基于两个字段啊,比如说我们这个题目当中,我是C2字段和C3字段呢,合在一起,我们构成一个联合的索引。那么这个联合索引呢,呃,对应的这个底层这个B加数长什么样子,那就我们下面来进行说明的。好,那既然呢,我们是基于C2和C3呢构成的联合索引,那我们就先按照这个C2呢进行排列,那C2值一样的情况下呢,我们再按照C3呢这个顺序呢,从小到大在排列,所以大家我们看这个具体的叶子节点,在我们这个C2都是四的情况下。然后呢,我们再考虑这个C3,这个紫色呢,就是C3啊,这个是A,这个是O,这个是U,是不是从小到大呀,然后五的话呢,也是C2都是五的时候呢,我们C3呢,这个BM也是同样的大,然后边呢,七九也同样的道理。
21:05
然后呢,我们这个叶子节点中,除了C2C3之外呢,我们还要保留一个是不是主键的C1的这样的一个值啊。有同学说,老师你这不是把C1 C2 C3我们这个表中的这个几个列都加到这了吗?这不就相当于是我们这个数据项的这个出来了吗?不对啊,不对啊,我们这个表中呢,这个题目当中只有这样的三个字段,那实际情况呢,我们可能是不是有十个字段啊。那十个字段的话呢,我们这儿呢,仍然说它是一个非剧组索引,因为呢,我们只有C1C2C3,你是没有呢,C4C51直到C10的。包括呢,即使在我们这个表中来看呢,看似只有三个字段,实际上我们还有一些隐藏列。啊,实际上还有一些隐藏列,我们这个非居住索引当中啊,是没有这个隐藏列的。哎,注意是没有这个隐藏列的。好,那么呃,接下来的话呢,我们有了这个啊数这个这个一结构之后呢,我们再去构建它的一个目录啊,这个大家应该也清楚,就是把你最小的这个抽取出来,由于呢,你是联合构建的,所以你不能光抽二了,是不是把这个C3的这个E呢也得抽取出来啊,然后对应的我们这个一呢是50啊就这样,其他呢,也同样的道理啊,去抽取啊,该双元列表还双元列表,该单列表还单列表,然后一旦呢,多余一个目录项的这个页的话呢,我们再去上层构建一个目录项的这个页。
22:20
哎,就可以了是吧,像这个呢,就不用多说了,然后呢,当我们需要呢,基于这个,呃C2,比如说诶等于四啊C3呢,呃C3呢,等于这个,比如说呃,O诶我们要进行一个查找的时候呢,是不是你就从上往下先找我们这个C2是四的啊,一看是在这个里边,C2是四的话呢,你看这个是四啊,这个还真就是O了,比如我再换一个吧,比如叫U吧。诶,我们这个C2是四,C3是U,那这个呢,呃,C2是这个,就是我们光看C2的话呢,有可能是在这里边有,也有可能是在这里边有,对吧,但是你看这个时候呢,这是个O,我们这是个U,那O呢比这个U呢要小,所以我们要接着去找的话呢,就不用考虑这一只了。
23:01
啊,那直接呢,因为四完了以后的话呢,这个O呢,比这个小,是不是只有可能是在这个里边了,在这里边再去找,哎,这就找到这了。哎,这个呢,我们叫一个联合哎索引啊,其实就是哎非居素索引中的一种啊就行。好,那么这呢,我们就把这三个概念呢,就说清楚了,然后接下来的话呢,我们再针对这个B加数呢,一些注意事项呢,他也做一个说明。
我来说两句