00:00
那么纸笔都准备好了吧?好,面试不不不,别写准备好,待会就这样,面试官他一定会问你,就是基本上你要是应聘就像我们所说的高薪12以上的岗位,就一定会考你SQL,而且考SQ,人家可不可能跟你说怎么建一张表,你跟我说说不可能吧,这面试官也丢不起这人吗?那我问这问题太low了是不是啊?就好比我问你说你会不会坐地铁是吧?那么这个时候会被你一个常见的问题几乎哈。九成会考到就是什么是索引,笔试面试都有这道题,这个时候严禁刨过去跟面试官说啊,所以就相当于是什么一本新华字典,前面有一个目录,然后呢,你要通过这个目录去索引,然后呢就能找到我想要找的字,答完了,这个时候的话呢,是不可以的。好,我们呢来看看,首先依旧来看看索引为什么在数据库里面这么重要,其实说白了,那些CQ的调整都是看索引它的颜色来弄弄。
01:05
首先我们呢,可以看到。SQ官方对索引的定义是什么呢?我们呢可以看一下哈,那么呢,如果你觉得多的话呢,我先遮一下,这样是不是好看一点啊,你看多体贴是吧,减轻你们的负担来,所以index,注意这个index是不是有很多种意思啊,在数组里面是不是叫下标,在数据库里面叫索引,在GI里面是不是叫展存曲库啊,还记得吗?那么呢,根据我们刚才所说index的一词多义哈,在数据库里面是索引,Get呢,是长存区,数组下是不是下标啊好,是帮助SQL获得高效数据的数据结构,也就是说你回答面试官的时候,首先要开篇名义跟他讲,所以是一种数据结构,这是官方的中英文翻译过来的。
02:09
原画可以得到所有人的本质,所以是一种数据结构。好,那么呢,我们呢,来看一下为什么要建一个索引来抬头同学们根据刚才哈,咱们写一张表,或者是一个技术,你那个内或者一个。字段,你要查一些技术书籍,Java Oracle myql backb mango DB等等,如果说你不去排序,这些字段是不是全是乱的呀?好,假设你现在要搜一门技术啊,Well啊,Book name等于MYSQ,那么呢,如果说数据量很多的话,没排序,跟我讲它怎么找MYS是不是五个字母,你呢,先找M,如果你这个name这个字段,Book name这个字段根本就没有排过序,不好意思啊,我呢,什么时候定位到M,我根本不知道,我只能是一个一个的搜。第二种情况,我把它按照26个英文字母ABCDFG到Z排好序了,你现在要找book name等于MYS从左开始,第一个字母是不是M,那么现在你第一栏M啊,我知道。
03:34
你也排好序了,全部就跟高个子照相一样,从高到低排好了,请问我还用去从A一直翻到B翻到C吗?是不是直接抓到M了?那么以说我们在MYCQL时候是这么干的,索引的目的在于提高查找效率,类比字典那么呢,它怎么会提高查找效率呢?如果你要查MYSQL这词,肯定是不是先定位到M2,再定位到麦,再找到剩下的S啊,Q和L,同意吧,你该就说如果你排好序的,我就直接从排好序的干嘛搂出来,没排好序,你是不是每次都得从A到Z,从A到这一圈圈的搂啊,好,那么这个时候往下走。
04:19
如果没有,所以那么你可能就需要从A到Z,如果我想找到Java开头,Oracle开头呢,那么呢,所以没有这个,所以这些事情你是不是根本无法完成啊,那么呢,索引的目的提高查找效率,那么你凭什么你就可以给他提高查找效率啊。继续往下看。来根据我们的风格,什么颜色,不但是红色以外,还有没有加粗啊啊,那么基本上就像我们一直说过,跟你们讲过的,不用说那么多废话,多肽你们一定会说父类的引用指向子类的实例听过吧一样,什么是索引排好序的快速查找数据结构,就是索引纸上给我抄一遍,前面我们刚才说了,你book内要查板买Q不排序,是不是只能是全扫A到Z,排好序是不是可以干到M啊,说明所以想要查的快,原来做的本子做的基本功是不是排过序啊,那么也就是说,所以有两大功能,第一个。
05:41
查找快,第二个排好序,也就是说,所以用于排序和快速查找,也即你定位的键的索引将会影响到你SQL的两部分。哪两部分呢,一个就是你。
06:02
所写的无外要条件,后面这部分的条件约束是否用到索引,他们是不是负责查找的条件过滤啊?第二部分排序排序,请问各位亲,CQ里面你们用什么排序回答正确,大家异口同声的说是不是what派呀?那么这开篇名意第一句话给我记着,所以会影响到你外后面的查找和orderbi后面的排序索引两大功能,查找和排序都会有影响听懂。当然你先记住这句话,到第三天的课程,我们拿N多个案例以后你就明白S不是乱写的,绝对不是。你们是不是觉得order by就order by ID升序或降序so easy啊,那么到时候的话呢,Order by是不是有单路复用和双路复用两种算法呀?啊,当我没说。
07:03
不管啊,行,我们先用这个好待会回头说,那么这个时候呢,我们可以看排好序的快速查找数据结构,那么呢,这块我们呢,先来看一下,哎。下面我们来看一下,首先我们来来看看什么叫排好序的快速查找数据结构,那么这个数据结构又是个什么东西啊?那你得给我说它是什么站队列还是什么东东呢?来看好同学们,你们在数据库的时候,前面我们是不是有介绍过三个文件内容,一个叫FRM代表表的结构框架,第二个你建好表以后,就像一块一份Excel的什么表格一样,你一条一条一条的往里面插数据,是不是买地类似于数据就来了,兄弟,就如同说你们大学里面图书馆,图书馆都去过吧,对吧?好,你没去过好图书馆你总该见过吧?哎,好,终于点头了,气死我了,还不专治各种不服是吧?好,那么这个时候各位亲,你们图书。
08:18
去借书的时候,你也知道应不应该分门别类的掰,好好,正常来说,不管你借书还是还书,你肯定会这样,假设你去借书的话,差不多他把它拿出来以后,扫描一下那本书上面是不是贴了个条形码,好一样就变成什么,你去图书馆管理系统里面也好,整个图书馆里面的藏书是不是就相当于我们数据库的表,就是我们的MYD,我们的数据date,这个时候你假设你说那个管理员我需要借一本射雕英雄传,那么OK,这个时候金庸的武侠小说一扫等等,他告诉你在二楼的三号柜子,四号抽屉第五个小格子里面就有,请问是不是瞬间定位准确精确区啊,否则的话呢,假设你们图书馆有100万册藏书,他跟你说你要借啥,OK,找吧,然后的话呢,一看里面,我估计大家不排除你非常牛是吧。
09:18
家里祖坟上喷火,第一本就是是吧,如果比较倒霉的话,最后一本的话,刚好告诉你本图书馆的藏书1000万册,这个时候你是不是要做一次全表扫描啊,那么呢,我估计你内心是崩溃的是吧?那么呢,我们呢来看一下,那么现在为了快速的查找定位了,以后别忘了我们刚才介绍过,是不是还有一个东西叫索以叫买爱呀,假设我后面是图书本人就图书馆管理员,好,你要找你的书,我在系统里帮你查一下,他前前面前台的那台电脑上面是不是有一个图书管理索引系统啊,这个索引是不是指示并指向了后面那些书在几号楼几个柜子,几号抽屉里面,那么言下之意,前面这个图书管理员,他起到的作用是不是就是一个索引,后面那100本书才是我们的date数据啊,这个模型。
10:13
但是问题是,这么多书,你怎么知道他到底在二楼,三楼,四号柜,五号柜,七号抽屉,八号楼呢?那么来,我们来看一下。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种引用,也就是说指针的方式指向了数据,这样是不是叫快速定位到啊?有点类似于什么,左边我们student等于new student new student,它是不是实实在在是我们那本书那个数据,而等号左边那个是不是一个指针引用啊?好,他告诉你,好,我扫描了你的书,还书,你给我把它分门别类还到哪,或者你借书从哪去取,这个时候它的模型是这样的。
11:07
这样我们可以在数据结构的实现一种什么高级查找算法,这种什么数据结构就是索引,再说直白点及我们Java程序员现在所接触到的常用的也就是B数索引数据结构里面是不是听说过的东西叫二叉数啊?好,那么来同学们,我们呢,先在开图之前,我们先来简单的解释一下。现在有些飞机上的专业同学,你也不要害怕,听我说,如果说哈,我去找跟我讲。咱们借还书,它是不是有那个扫码枪,就是点一下呀,扫出那个名字,假设倚天屠龙记,天龙八部也好,每本书其实到最终到系统里面,咱们会不会拿什么中文汉字去查,一定是做了剑职约束,对TV匹配了以后,射雕英雄传假设这个书的编号就是28或者89,听懂了吗?然后他这儿扫了以后,那么你怎么知道在哪儿呢?他呢,假设我们大家都知道,这个时候我们这儿有一个数据假设就是30是一个折中参考的哈,假如说哈一扫。
12:25
天龙八部OK,这本书的编号是72,我一扫跟三十来比,请问72是比30小还是比30大啊?那么这个时候我们约定一种规范,比30小的请你呢在左边,比30大的请你呢在右边,好,那么假设这货我们呢是一个20。这货我们又过来吃一个多少,40。
13:00
O吗?请问天龙八部这本书,72跟40相比,比它小还是比它大,大的话我们又把它放在右边,这样的话,请问我是不是中间过滤了很多呀?否则假设哈我的是72,我这个数字假设总量是100,我是不是得从一一直翻到72啊,但是现在是不是就像是折半查找一样,给你砍了中间很多东西啊,那么这种树形的结构了以后我们呢,来看看。COLUMN1COLUMN2,你就当这个COLUMN1叫ID,这个COLUMN2叫book name OK吗?好,这个是不是内存的地址啊,左边是数据表,是不是就像我们的横行列一条条的数据啊,一共呢,有两列七条记录啊,最左边是数据记录的什么地址啊,物理地址啊。
14:04
最终我们再看这些,你就是一个什么图书馆大楼里面的一本一本具体的数据,一本一本具体的参书,而右边这个呢,就是我们的图书管理员前台用的那套索引检索电脑系统,他是不是告诉你哪本书在几楼几抽屉几号柜子呀,干嘛呢?假设兄弟我呢要找四号这本书,我一扫码枪不克内姆,假如说哈它呢,假设再来一列叫天龙八部,这本书对应的编号就是91,这个最左边0X是不是16进制,真真正正数据记录的硬盘上的物理地址啊,然后干嘛呢?扫了以后先来一个91,请问比34大还是小大往右边放91,再比一次,比89是大还是小?好,再到这有了没好,OK 91。
15:04
D过来是不是指向这个,那么这个时候我是不是比较三次以后迅速可以从很多测参数当中找到这个物理地址,检索出我们的数据交给主人去查阅呀,那么也就是说我们为了加快COLUMN2的查找,可以维护一个右边所示的二叉查找数,每个节点分别包含索引键值和一个指向对应数据物理地址的地址指针,这样我们在用二叉查找的时候,一定的复杂算法复杂度以内获得相应的数据,从而是加快检索出符合条件的记录啊,抬头。现在我要找这本书,你不见索引都是往里说,反正书都在里面,你自己去找吧,你见完索引以后,我是不是迅速快速定位到在二楼三号柜子,四号抽屉,五号小小格子里面啊,那么这个时候就说白了什么,为什么会得到那么精确,刚才我们说的二号楼三号抽屉等等,是不是就是它的这个物理地址啊,你这样是不是一次性过去,你就不用全表扫描,你这样是不是就一本一本的精确打击一样的可以找得到啊,那么呢,从这我们呢,就可以得到我们相关的结论。
16:24
这个时候请大家看好官网上的翻译,就是这样,数据本身之外,Date以外,数据库维护着一个满足特定查找算法,这样的话,这些数据结构以某种方式指向这个数据,这样就可以在这些数据结构的基础上实现高级的查找算法,这种数据结构就是索引,以我们今天所讲的都叫B数所引btra,它的名字就叫BOK,好,那么这个呢,你不用记,来抬头同学们,当你们在工作过程当中,一定会跟一种人吵架,但是会和另外一些人的关系非常好。以家va程序为例,跟你们撕逼吵架的是不是就是产品经理呀?当然大家也看到过是吧,深圳某家科技公司因为产品经理经常改需求,是被五个程序员打了一顿的啊,这个时候呢,大家扯淡的哈,当然正常的工作分析。
17:24
该吵的吵,当然呢,咱们呢,是不是不能动手啊,好,主要程序员比较多是不是啊,产品经理就一个啊,再来,但是另外一种人会和大家关系非常好,那么这个人是不是就是我们的运维工程师或者是数据库管理员啊,那么呢,你会发现你晚上熬夜换包生产部署的时候,会有一种人会陪你留下来,而且他们基本上出现的时间是月黑风高杀人夜,为什么呢?你加班到11点,宵夜都吃完回来了,准备走了,他呢,起床了,准备来上班了,刚好到,诶,你也来了啊,对,我也准备走了,是吧?北京it公司上班白天和黑天是不是不重要啊,那么干嘛呢?他来干什么呢?这个时候注意这个DBA过来可能是过来做,所以重建工作的好来。
18:24
同学们,我们呢,来看这张图哈,听好,这个不是跟你开玩笑,这些都是正儿八经的,来听我说,咱们Java开发工程师是不是端端端的往这张表里面插数据,好而跟我讲。我们为了查的快,DBA是不是要给每天的数据备份,恢复日志,最重要是不是要见索引抬头,弟兄们都知道,我们在做系统的时候,你在写delete这个方法的时候,到最终其实而言是不是不会调用真真正正解的方法将数据库里面的数据干嘛物理删除啊,我们会干嘛,我们会有一个干嘛active,或者就说什么标志位,把它从激活状态变成了非激活状态啊,什么概念呢?就是说我们这个时候数据的连续性是不是还保证,比如说有十条记录,一二三四六八九十好吗?你删的时候第五条一删,但是我没有真真正正的delete塔,你会看到很多互联网公司他会说,诶,在service层调用的方法搞到最后底下是一个update,它update干嘛呢?就是把那个激活标志位,比如说从一。
19:41
是激活状态改为了零,这个时候请跟我讲,逻辑上这条记录是不是被删除,但是物理上存不存在,那么这是为什么呢?感谢。首先第一个你Java工程师不用,别忘了现在已经进入到云计算和大数据的时代,别的部门是不是最好有这个客户浏览记录,客户下单记录的完整记录啊,所以说大部分的时候是不是把它从使用状态变成非激活状态,尽量不删啊,这是第一个原因,为了数据分析。第二个原因什么呢?为了索引抬头同学们非常重要,为什么我们12点的时候会跟DBA会跟数管数据库的工程师一块干活呢?比如他约你啊,你要下班了,我刚上班了啊,要不这样吧,再陪我去出去吃吃夜宵,反正公司爆是吧,你又想不又吃一顿啊,越来越胖对不对?好干嘛呢?注意不杀你是。
20:41
为了数据分析二一个跟我讲,假设你跟图书馆管理员跟他说了,借一本倚天屠屠龙记,他告诉你在三楼二号抽屉,你很嗨,跑过去屉一打开,发现里面什么都没有,请问这个时候是不是索引不准啊?第二一个问题也就是什么呢?假设这个图书管理员呢,非常抽风,心情好的时候就把它放二楼,心情不好的时候把它放五楼,也就这本书的位置天天变,请看右边这张图,那么这个时候这个索引,这个指针一种指的越多,是不是失效的越多呀,你在进行这个数据越频繁的修改,删除,新增了以后跟我讲,慢慢的这棵树是不是会失效啊。
21:30
也就是说慢慢的,诶怎么查找越来见过索引以后,怎么还越来越慢了,因为有时候索引指不准了,第二种你删掉以后,比如说明明这儿91你要删,你干掉以后,你指过去是个空的,请问这个时候查找是不是就挂了,所以说这种情况下,很多DBA一不做二不修,干脆大晚上的过来干嘛,我加工程师白天你们干完活了,那么先说好,我现在就锁表了,别动了,我把索引重建一遍,他们也非常的辛苦,这个时候其实说白了,到最后所有中国互联网公司牛叉的系统到最后是不是都是人肉运维啊,什么叫人肉运维呢?是不是就是让运维工程师在那非常加班加点的,很辛苦的,那守着呀,维护就是其实很多时候有些bug怎么着呢?哎,互联网嘛,工作压力又大,大干快上,先完成后完美,小步快跑小步快跑,反复迭代,自然而然萝卜快的不行,你是不是或多或少带着bug呀?
22:30
那这个时候是不是一路火花带闪电,那个bug终有一天要挂了呀,那么这个时候是不是就靠运维工程师给他活过来,起死回生啊,然后呢,要反馈回bug以后,让开发部的兄弟下一波干嘛,是不是就把这些bug修复,双方的时候是不是结下了深厚的战友情谊啊啊那么呢,我们往下走玩到这儿了以后,我们会明白一个问题呢,就是说那么那个时候DBA过来以后,他干脆说好数据稳定了,我就按照现在这个最新版的话,是不是再把索引建一遍,那么这个再重新构建一遍以后,你你再去查,这个时候你假设你这个图书馆。
23:06
办一次家,这些书好不容易重新分门别类按好了以后,这个时候索引再重新打开,是不是就才变得查的快了?嗯,第二个为什么查询快增删慢呢?别忘了在数据库里面要干嘛呢?你在改一条数据,除了改这个数据的记录以外,是不是还要改它的索引啊,就像我说的图书馆的这本书已经这本书不好意思啊,三楼从此以后不要再放这个小说类,武侠小说类的,全部捅到四楼,三楼的话放新闻类的书籍,那你跟我讲,你一做这个update,除了数据要改变,跟我说索引的指向要不要变,所以说有时候update更新慢,一是数据在改,二一个重新指向的索引是不是也在改,否则你建索引是不是指不对了,那么所以说你频繁的删改的字段适不适合建索引啊,不适合那就支离破碎,这根树干嘛建起来以后也是残缺的,那么所以说一般来说呢,我们呢,得到这么。
24:07
一个结论,索引本身也很大,它不可能全部在内存当中,因此索引往往以索引文件的形式存储在什么上面,告诉我我们学过的Linux的调优排错查找的命令,如何查看磁盘空间剩余,想一想说一下,那那么呢,一般来说索引本身也很大,它是不是也是作为一种特殊的数据结构,以文件的形式存储在磁盘上,那么呢,来我们Java开发工程跟开发相关的程序啊,所说的如果没有特别说明,都是指B数结构组织的索引,就是我们的所说的什么多路搜索数,并不一定是二叉树哈,好,这叫多路搜索数,因为是不是也可能有三叉啊,好,那么这个时候其中还有什么G?
25:07
及索引,次要索引、覆盖索引、全文索引等等等等,这些唯一默认索引干嘛都是使用鼻加数统称索引?当然除了B数种结构以外,我们是不是还有哈希索引等等呀?那么呢,结合我们的目前相关的介绍,我们着重是介绍跟Java开发相关的B树索引,清楚啊,OK,好,那么呢,耽误了一点点时间,那么呢,同学们今天的课呢,就先到这儿好吧。
我来说两句