00:01
大家好,欢迎大家继续收看上硅谷的Linux云计算视频,我是刘川老师。那我们本节课呢,来讲一个数据库方面关于索引的问题,那这个呢,其实就是之前我给大家说的,我们讲了一个类似于软优化的这么一个操作啊。大家都知道啊,我们既然负责的数据库维护呢,主要是以集群和它的中间件方向和部署搭建相关的,那相应的软硬化则不是我们的侧重点,但是呢,很多时候啊,生产环境中啊,可能并没有专门的这种数据库管理员或工程师,那一般情况下呢,可能会有开发工程师,或者是有我们运维工程师兼职来去做这个事情,那我们也一定要对数据库的索引有一定的了解,以及我们要知道索引这个东西用来干什么的,以及怎么来操作,OK。那我们来看一下这个索引相关题目。这个题目呢,是MYSQL什么时候出现索引啊,什么时候出现索引?OK,那我们来分析这道题目考察的东西,首先呢,就是什么是索引,那我们首先要知道索引的概念以及索引的作用是什么,其次呢,我们需要知道索引的一个分类啊,需要知道索引的一个分类,其次我们需要知道索引的一个劣势,那就说为什么没有优势呢?我们在说什么是索引和索引的分类的时候,就会提到索引的优势。
01:28
那再一个就是什么时候需要创建索引,以及哪些时候不要创建索引,索引是好东西,但并不是所有的时候都需要使用索引,OK,所以呢,我们会把这个索引相关的这些问题呢,都给大家这个清晰的阐述一遍,然后呢,大家以后遇到类似的问题的时候,就可以参照我们这个对应的答案来进行一个回答和描述。OK,首先呢,我们先来看第一个。那就是关于什么是索引。那所以呢,本质呢,还是一种数据结构,你可以理解为,所以其实还是我们对应的一张表啊,一张表,只不过它不是一张完整的表啊,只不过它不是一张完整的表,它是把我们某一张数据表里边的某一部分数据拿出来,重新创建一张新的表,那排好序来之后呢,来提供一个能够快速查询。
02:24
数据结构,以及数据的这么一种结构工具,你可以理解为它是数据的这种分身,那生产环境中我们理解索引可能相对比较难理解,但是生产,但是我们这种现实环境中,我们就好举例子,比如说我们的汉语词典啊,大家都知道我们的汉语词典啊会。按照我们的字母开头或者偏旁部首、笔画等等来进行排序,创立这么一个目录,对应的这个目录其实就是对应的索引。注意,我们的词典或书籍的一些目录其实就是一个索引啊,其实就是一个索引,那对应它的功能很简单,就是为了帮助人们能够快速的定位你所要查询的内容在哪一个页面。
03:13
啊,在哪一个章节,哪一个页面,所以说所谓的索引就是为了提高我们查询目标对象的一个查询效率和查询速度那。大家也知道了,我们合理的创建索引之后,就会合理的提高我们查询的一个速度啊,查询的一个速度。数据库这个东西呢,为了提高我们对于数据库里边的表里边儿的数据的一个查询速度,它就创建了索引这么一种概念,并且呢。我们可以通过人为干预它去创主动创建索引来完成索引的建立,以此呢,后续查询的时候,我们优先来查询索引,通过索引来定位我们的数据的位置,然后再去找对应的数据位置,这样就会极高的提高数据查询的效率了。
04:04
那大家发现这个地方有这样一个描述啊,那这些数据结构呢,可以在这些数据结构的基础上实现高级查询算法,这个所谓的高级查询算法就是索引了啊,就是索引了,OK,那索引呢,概念完成之后呢,我们来看一下索引的分类啊,索引的分类,索引的分类还是蛮多的啊,主键索引那其实是这样的啊,其是这样的,我们一般情况下在创建主键的时候,就会直接对主键创建一个独立的索引啊,创建一个独立索引。那再一个就是到单键索引,一个索引只包含单个列,一个表可以有多个单列索引,那如果字段会被经常来检测的话,那就直接用单指索引就可以了,按单指索引就可以了。那再一个就是复合索引,复合索引指的是一个索引包含多个列,那这个就是和单值索引相对应的一个索引模式了,那比如说电荷波上有性加名字,那最好不要超过五字,也就是说这种复合索引啊,这种复合索引我们既可以用性来做单列作印,也可以用名字来做单列作引,但是呢,我们既拿性又拿名字,把两个合并在一起来做了一个复合作引,这样查询的时候,我们既可以使用什么前缀姓氏的方式来查找,也可以使用完整的名字方式来查找,那相当于一个索引有两个查询的规则啊,那这样的话会大大减轻我们对这个呃东西的一个查询效率,反而如果我们既创建一个姓氏的索引,又创建一个名字索引,会发现它会有所冲突,并且呢,两个索引查询都会额外消耗很多的系统资源,OK。
05:45
那再一个就是唯一索引。所有列的值必须是唯一的,但是允许有空值,也就是说索引当中的列当中的值一定是不能重复的,重复性的话,那和我们正常数据表里边是没有区别的,正常数据表里边可以有重复,那那那我们和查那个是没有啥区别的,有也就意味着我们索引当中没有重复的必要,比如说我们在这个索引里边。
06:16
按照条件查询啊,姓李的用户的名字,那这个时候在这个索引里边,姓李的可能就一条记录,但是对应的这个姓李的这条索引记录所对应的真实数据可能有很多条,几十上百条数据,所以说这个时候索引相当于是简化了我们的数据,简化了我们的数据,用姓李来代替所有姓李的。啊来替所有升级的,然后呢,其次是可以有空值啊可以有空值。再一个就是。普通的索引和唯一索引啊,可以称之为叫辅助索引啊,可以称之为叫辅助索引那。我们这个地方的所有的类型相对比较多,那。生产环境中用哪些索引,要看具体的生产环境中的一个具体的一个需求,OK。
07:04
那这是我们的索引的一个分类,那接下来就是索引的一个劣势了,在说劣势之前,我们还是要详细的把它的优势说一下啊。那索引的优势呢,在于索引提高了我们查询的一个效率啊,查询的一个效率,把查询效率提升上去了,而且索引还有另外一个功能,那就是索引避免了我们直接查询表的时候,对表内的内容进行一个排序的操作。有些时候呢,我们会对表内进行排序,排序的原因是查找到重复内容,但是我们索引是不是把所有重复内容合并成一条记录了,那索引当中就没有重复这个内容,所以说使用索引还可以减少对数据表的排序操作。其次呢,索引还可以将我们随机的IO查询变成顺序的IO查询,同样也是因为索引它已经经经过排序和蛆虫了,OK,那这是它的一个优势,那再来看劣势。
08:04
劣势就是索引实际上也是一种表啊,也是一张表,也是保存了主键、索引字段等等这些信息,同样所有的索引记录都指向实体的表。所以说索引也要占空间,那大家都会问了,索引这个东西到底是创建在哪里呢?是这样的啊,当我们每次用create table创建某表,是比如说我们创建了一个A1的表,其实这个ae表啊,分为了两个空间,一个叫索引空间,一个叫表空间,表空间是用来存储这个表内所有的完整数据的,而索引空间就是来帮助我们来创建一个一个索引的,诶,这些索引的数据指向就指向我们真实的表。而我们每次来查询A1这个表的时候,优先查A1表的索引空间里的索引,通过索引锁定具体数据的位置,然后再去找数据,那效率是不是就快多了啊,效率是不是就快多了,所以说对应的索引它也是要额外占空间的,这就是他的劣势,那就是它的劣势。
09:06
那再来看第二个。索引虽然大大的提高了查询的效率,但也会降低更新表的速度,原因很简单啊,刚才跟你画那个图,Ae表两个空间,索引空间表空间,那我问你一个数据要更新,更新完具体的真实数据之后,那我问你相应的索引是不是要更新啊?所以说,当我们创建索引之后,你会发现我们的数据更新既需要更新。实际的表又需要更新所有的表,索引的表,所以说你会发现需要有更多的更新对象,那这个时候就会有一定的影响,但是呢,并不是那么特别大,但架不住我们的这个数据规模变大呀,所以说,呃,所以呢,提高了查询速度,但会稍微的降低我们的数据更新的速度。OK,那再来说一下我们第三个。
10:01
关于第三个呢,指的是索引只是提高效率的元素或因素之一啊,如果MYSQL有大量的表,那就需要花费大量时间去研究和创建比较优秀的索引。OK,那这个时候你会发现呢,我们创建索引的过程也是一个非常非常消耗时间的过程。当然其其他的方式也可以来做数据优化啊,OK,那这些都是我们的一个关于索引的一个劣势。再一个就是我们需要提一下哪些时候。创建索引会比较好,哪些时候呢,创建索引没有必要啊,比如说。比如说。我们呢,主键默认在创建和声明的时候,就会自动创意一条唯一索引。这个就不需要我们管了,OK,第二个频繁作为查询条件的字段应该建立索引,比如说ID字段。
11:00
啊,比如说ID字段,比如说内幕字段,这些就是会频常查询的一些字段,比如说某某长期字段,就是频繁被查询的一些对象,我们就可以给他创建索引,OK,再一个查询中与其他表相关联的字段,外键关系,创建索引,也就是说我们这个字段是两个表的一个关联字段的话,需要创建索引,因为创建这个索引之后,可以提高对我们表中的什么关联关系的一个查询效率,OK。那频繁更新的字段不适合创建索引啊,因为每次更新不单单更新了记录,还会更新索引内容,OK,再一个where条件里用不到的字段不创建索引记录。啊,不创建索引记录,那再一个就是单键和组合索引的选择问题,那在高并发的模式下。建议创建什么组合索引,因为高并发下尽量的不要创建更多的这种查询线程,那你如果只有一个组合索引,就只有一个一个的线程过来啊,如果你有两个索引,那就是很多个线程同时对两个不同的索引进行检索和查询,这个时候它的线程消耗会额外高一些。再一个。
12:17
查询中。排序的字段。注意查询中排序的字段,那排序字段若通过索引去访问,则大大会提高。排序的速度,也就是说本身所以已经把所有需要排序的整合到了一起,就不需要对真实的数据就排序了,所以说会提高效率。再一个。查询中统计或者分组的字段需要创建索引。那是。这是我们哪些时候需要创新索引,以及其中还包含着两条,哎,不需要创建索引的一个记录,OK。那我们再看看哪些不需要?当我们表记录太多的时候。如果几万条啊,太少,不是太多太少的时候,如果只有几万条的数据,那没有必要创建索引,那300万数据量创建索引才是有必要的,当然还不一定,为什么,很简单。
13:15
这个说法呢,只是针对我们的表格当中字段数不太多的时候。如果一个表格当中字段数有十几个,20几个甚至更多的字段数,那这个时候你的这条数据量会非常大,相反,如果十只有几万,你都不创建索引的话,这个时候效率会降低了,等到有300万的时候,可能你这个数据表查询都查询不了了,所以说呃,这些东西呢,只是一个。案例,那你呢,要根据自己的实际情况去进行一个操作啊才可以,OK,再一个频繁更新的字段,不一创建啊,OK,所以说这个就是刚才所说的那个了,再一个性别国籍字段。有公式的这种啊,有公式的这种啊,索引选择性的啊,不建议大家创建字段啊,字段中值的个数啊,字段中有不同的值的个数的这种。
14:10
然后呢,建议不建议创建我们对应的索引记录,所以说呢,有些时候也不是都建议创建索引的,索引这个东西只是适合呃,某些特定的情况。所以这个内容讲完之后呢,我们来给大家讲一个类似的面试题,比如说。呃,我们生产环境中,如果突然之间啊,不小心用drop命令把数据库搞丢了,那然后呢,我们应该怎么来恢复,那是这个地方需要给大家说一下啊。这种事呢,首先一定会发生,生产环境中是一定会发生,但是根据我们的经验而言呢,数据库丢了也没事儿,为什么呢,有备份。啊,有备份,这就又提到了关于备份的重要性,啊,备份重要性。虽然这个题目呢,不属于我们这个阶段,但是我再提一句啊,大家一定要记住,不管是你做哪一个方向,数据备份一定是最重要的,而且数据不能备份一份,要做备份多份啊,而且呢,它的备份频率啊,也要根据对应的数据重要性去做修整和调改,呃,就是修改和调整,OK。
15:17
那既然有备份了,我们直接恢复不就得了吗?当然这个问题既然问了,肯定不是说让你直接去恢复备份啊,OK,那么就来说一下,如果我们的数据丢了,如何来进行恢复,那这个地方呢,我把答案给大家总结成了这样的六条信息,那我们呢,是模拟了这样的一种。呃,故障出现,然后来恢复。假设呢,我们的这个。这个这个数据丢失了,然后呢,我们可以找我们的b log日志。啊,我们说过之前的主从开启b log日志是不是为了把这个数据保存到备份服务器上,但现在的b log志可以直接为我们所用进行数据恢复。很简单,病因log日志已经标记并且切割好了病log日志里边命令的位置,那假设我们目前的病因log日志是第九个009这个日志那。
16:06
这个009之前呢,我们已经有了完整的变量日志了,那这个时候我们就需要对009这个日志进行操作,那找到之前以及全部的数据库备份之后,并且对每一个并日志文件做好标记,以及对应的设置位置,那假设最早做完整这个。备份的是005,那也就是说005之后到009之间的是我们这个新备份的,以及可能丢失了的,因为005已经。是完全备份了吗?所以说005直接恢复就可以了,剩下的005008的才是我们需要进行恢复的内容,那我们呢,可以使用MYSQL的命命令把005~008B log日志文件里边的SQL语句找出来。并且一定要删除掉里边的那个删除语句,为什么这个B漏日志,他个是增删改授权取消授权都记录的,那如果你保存着里边那个删除命令,你一恢复是不是又删了,所以说啊,一定要把语句分离出来之后,把里那条删除语句啊干掉,然后先恢复完整备份,那就是先恢复005。
17:15
然后再在005的基础之上恢复005~008之间的这些,呃,零八到之间的这些,然后呢,005到零八之间这些恢复完之后呢,再把009再恢复上。哎,就没有问题了,最终呢,我们刷新我们的这个什么。B log日志,我们的所有的数据就都会回来了,就相当于我们自己一开始是主服务器,我们呢自己保存了我们的bin log日志文件,但是呢,我们自己把主服器干掉了,诶我就可以拿着主服务器产生的B里面反向推回所有的数据。这就是我们如果删掉数据之后的这种恢复方法,但是啊,还是说。这种时候我们遇到比较少,原因很简单,我们的数据是一定会做备份的啊,一定是会做备份的,所以说大家生产环境中呃,也不用特别特别担心,万一数据丢了怎么办,我们一定是要有备份的,当然备份策略也是我们来设置和编写的啊,一定要提前的把对应的这个备份策略设置好。
18:20
数据库这个东西,它是我们整个呃。各种什么购物网站啊,什么游戏平台啊等等,不管是什么,数据库一定是最最重要的,那如果我们去负责数据库的管理和维护的时候,一定要记住数据库一定要谨慎操作。一定要谨慎操作啊,千万不要随随便便的去这个删除对应的一些文件和信息,OK,一定要提前做好备份。那对应的数据库内容的讲解呢,我们这个就本节课就讲了这个索引以及数据如果丢失了,我们怎么恢复这么一个题目,OK,那我们本节课就讲到这儿,我们下节课再见。
我来说两句