系列 6:P82:深入剖析MySQLl背后的架构设计,带你充分了解MySQL的架构设计 - 马士兵学堂 - BV1RY4y1Q7DL
这个东西啊,我先说一下,你连了它之后,对你对于mysql的调优也好,还是对mysql的深入理解也好,都是有帮助的好吧,那我们在划分的时候,基本上会发划分为三个层次,第一个层次我们经常称之为叫客户端。
客户端,什么叫客户端,就比如说我们自己写的代码,像jd b c的对吧,比如说你们自己之前用过的一些工具来vc对吧,再比如说用的sql这些东西全部都属于客户端,客户端它存在的意义和价值是什么,注意的。
只是为了提交sql语句,就建立连接,提交搜索,明白意思吧,把这件事你要先搞明白了,叫建立连接,提交sql第一个步骤,当客户端完了之后,客户端是向谁发起连接,并且建立连接呢。
在下面第二部分包含了第二个组件,叫做server,server是什么意思,指的是mysql的服务,这东西啊怎么去理解它,很明显,假如说你想运行你当前的mysql的话。
那么意味着你必须要先开启mysql的服务吧,只要打开你的电脑里面一定有一个mysql 5。7,显示的是正在运行,它表示的是mysql在运行的这个进程,运行的进程,如果你想正确的正常的连接单词口。
这东西必须要有的,如果你在linux服务器里面,比如service mysql is start,它也属于启动mysql的服务服务,必须要正常,大家看到了,我在服务端这块我画了很大很大的一个框。
为什么很大原因很简单,这里面其实也包含了非常非常多的组件,好什么组件,第一部分听好了,第一部分叫做连接器,这个连接器代表什么意思,就其中一个组件一个部分好吧,它主要承担的功能也非常简单,叫做管理连接。
管理连接,第二个要验证权限,每次在进行数据库的访问的时候,必然是不是需要输入用户名和密码,它会进行权限的一个验证之类的啊,这是这块的一个基本操作,而且我们是可以查看我们msl对应链接的。
我问一下有多少同学之前查看过msl的连接。
看过吗,有一个很简单的命令啊,我们来看看。
比如说我这先登录nsgo杠u root杠p,123456进来写个东西叫show process died。
这就表示我们当前数据库里面正在建立的连接。
有几个,有两个正在访问我们当前的一个数据库,叫connect to master,还有一个starting对吧,只是我们对应的一些连接操作。
你知道这玩意就可以了,就这一个连接器,我们一般很少关注于这个模块,我是第一部分,第一部分连接器,当我连接成功建立之后,第二个步骤叫什么叫分析器,这个分析器是个什么玩意儿呢,什么叫分析器啊。
其实非常简单诶,这分析非常简单,其实大家注意了什么叫分析器,我们的sql语句,最终是要提交给mysql server来开始执行的,但是sql语句是个啥呀,其实在我本人看来,你写的一个sql语句。
比如最简单的select行from table,这个就足够简单吧,你在公司里面也可能写一个上百行的sql语句,它可能会变得非常非常复杂,但不管是简单还是复杂,你都要搞明白一件事。
他说白了就是一堆的字符串,而我的server拿到这一系列字符串之后,我是需要对当前的字符串进行,某些简单的解析操作的,有些同学应该听过一个名词,我不知道有没有听过啊,叫a s t,有听过吗。
什么叫a s p,它的全称叫做抽象,民法术最终一个简单的sql语句,不管多简单都死完,sql语句都会转变成一个树形的结构,有人见过这个抽象语法树长什么样子吗,见过的扣一,没见过的扣二见过吗,好吧。
有同学没见过,今天我来带你看一下,其实啊树长什么样子,它又长什么样子,这东西啊,你善于去看官网,我要打开一个官网,有一个组件叫3d sphere,它是一个分库分表的一个组件,在当前这个组件的官网里面。
他给我们展示了一张图,图里面展示的就是抽象语法树这样的一个结构,比如说不管你的语句,sql语句什么样子,他都会帮我们进行一个转换,这么慢吗,来中文这个网站,有中文网站拿过来之后可以直接进行查看的。
什么情况能这么慢,4。2s,咦,这咋了,是我网络的问题吗,来打开concept,这太慢了,4。一点,可能因为我同时开了两个直播间,所有点有点卡,哎呀这看不了贴子,重新连接一下,我搭完梯子之后。
你们这个客户端听课这东西就断掉了啊,什么情况,这是,算了有点慢,咱慢慢开着吧,慢慢慢开着,看完之后我们再说,这不是公司网速的问题啊,老师笔记本什么配置,我怕说出来吓死你好吧,懂了吗,一会儿带你看。
然后慢慢打开的,那这里面会进行两个最基本的操作,一个叫词法分析,你的语法分析,但不管你怎么进行司法分析还是进语法分析,最终会转换成一个抽象语法树,而我们sql语句在进行正常执行的时候。
都是按照这样的一个树形结构来执行的,有很多同学可能会对这个呃分析这个工具啊,或者分析这个插件有感有比较感兴趣,我再给大家说一下,一般情况下sql语句进行语法解析的时候,重点或者用比较多的有两个组件。
第一个组件叫a n t l2 ,这第一个第二个是阿帕奇的,这东西我也不知道怎么读好吧,我就不给大家读了,这样东西用的是比较多的,如果谁不清楚的话,也很简单,你可以百度搜一下a n t l2 。
想了解的可以详细了解下,就告诉你了,说这东西是可以根据输入自动生成语法数,并可视化的显示出来的,开源语法分析器,这是第一个好,除他之外,还有第二个叫阿帕奇,这东西它也是一个开源的sql解析工具。
可以将各种sql语句解析成抽象语法树,明白意思吧,就这玩意的玩意儿,如果你在公司里面需要去开发,或者说需要去自研,我自研一些呃sql语句的一些中间件的话,这个时候可能会涉及到sql的语法解析工作。
如果不需要的话,那这块是没是没必要了解的,可以不了解哈,好吧,来找一下shing costc,官网又变了,这这盖子都宽敞,内核内核的一个引导,这边有个pass engine叫解析引擎。
在当前解析引擎里面有这样一个东西,来看好了出来了啊,晚上看这个词组语句,没有人不熟吧,select id name from the user。
where this is等于active and h大于18,我们从这里面能够发出什么信息,像这里面的send from wand,这些东西是不是都是我们对应的关键字。
但是像id name table名称加上我们的字段,加上我们对应的一个值,这些东西都是可变的吧,所以它会把你当前的这个思思路语句,转成一个这样的树形结构,整成这样数据结构,看到了吗。
最上面是root节点,下面绿色的表示我们对应的关键字,这里面叫做token标识token,然后用film属性有id和name好吧,有tables告诉你,t user clinicians有条件。
首先里面有and等于大于,这都是我们的token关键字,下面是我们具体的一些变量值,它都会填充到这个地方,所以不管你写的sql语句,都会转成这样一个数据结构,按照这样的一个数形结构来进行。
具体sl的解析工作,来这个东西了解的话,给老师扣个一,看到了吧,就这样子好吧,就这样子,当然你不需要不需要详细去了解,这个过程没意义是吧。
小子你说这是录播吗,对是录播,你是回答非常正确啊,好了,这是第二部分核心的一个组件,讲个色儿吧,我加了色,总感觉很丑的样子,填完色之后效果立马就不一样了,好吧,ok这是第二部分。
然后呢第三部分除了分析器之外,下面还有一个东西叫什么呢,叫做优化系,优化器优化是什么意思,我们经常说我要进行sql语句的调用了,其实在mysql内部里面,他已经要进行相关的一些优化调整了,刘老师。
这需要进行什么优化调整吗,比如说我举个例子吧,我们经常写一个sql语句,叫flat行plt 1,然后撞1t2 t一点id是等于t2。2i d,我问一下,对于这样的一个sql语句,它是先读取t一这张表。
还是先读取t2 这张表,现在去哪个,你知道吗,这个时候一定有人会告诉老师先读取驱动表,然后再读取另外一张表,你告诉我什么叫驱动表,他每次一定是都先读t1 ,或者都先读t2 吗,不是吧,对不对。
这是不一定的,所以对于先读t一还是先从t2 ,这个时候就是由我们对应的一个优化器来选择,执行的优化,选择执行,而优化器跟大家说一下,优化器在进行优化的时候,主要依据于两个标准,第一个标准叫r b o。
第二个第二名叫c b o,什么叫r b o,所谓的r b o表示叫基于规则的优化,cpu要基于成本的优化,在现在的主流数据库里面,像这个cpu用的是比较多的,r b o用的是比较少的,但是你不要说老师。
你能给我说一下,具体的优化器有哪些优化规则吗,如果你想看优化规则,不好意思,需要看源码这块,我也没有怎么看过,我虽然没看过mysql关于优化数方面的一个解释,但是我看过一个框架叫做have,你知道吗。
你知道这玩意儿吗,还有你知道这这这个东西吗,have数仓零税仓库哇,新仓库里面在进行色度解析的时候,它也需要一个优化器,在have里面我看过have源码,看源码里面我那是二点,不是1。1。2版本,1。
1。2版本,在这个版本的时候,它里面大概包含了134个优化器,134个,就根据你不同的sql语句的情况,来判断说我到底使用什么样的一个优化规则,是这样的方式,而mysql里面有多少个,我具体我也不确定。
因为mysql源码是用c语言写的,我看c语言虽然能看,但有点困难,所以这块了解比较少,所以你大概知两个东西就可以了,如果你想详细看的话,这东西也是有地方可以查的,你就搜一个东西叫msl cpu就够了。
看到了吗,mac p u的什么体系,什么之类的,sql优化器,cpu和r b o分别代表什么意思,里面有一堆的体系工作啊,c p u那是cost r b o,找数基于规则的优化器。
和基于代价或基于成本的优化器,就这意思好吧,我还以为是直播呢,不是直播,是录播好吧,r b o基本团队现在主用的就是c p u,r b o现在几乎用的很少了,所以大概只有两个概念就够了,这是第三个组件。
包含三个组件之后,下面还有第四个组件叫什么,叫做执行性时间线,有什么有什么作用呢,它的意义在什么地方,其实也非常简单,它的作用是,执行sql跟执行sql,跟存储引擎,交互村长已经进行交互。
这句话什么意思呢,其实非常简单,朋友们,比如说我们现在换了客户端了,我们下面画了中间的server层,其实在这两层的下面还有一个层次,这个层次这是干嘛的呢,我们叫做存储引擎好吧,什么叫存储引擎。
就是你们之前说的一些东西,像my sum对吧,像in n d b对吧,像memory,对吧,这三东西都是指我们存储引擎,那最终我们的直线器是需要跟我们的存储引擎,进行交互的。
它需要从存储引擎里面把数据给查询出来,并且返回给我们具体的一个客户端,明白意思吧,来我画这张图能看明白,同学第20扣一自信点把吧,去掉这些东西好吧,当然很多同学啊一直对于存储引擎的概念。
可能理解的并不是特别清楚,我想问一下什么叫存储引擎,这东西到底怎么去理解它,谁能告诉我,我们怎么理解存储引擎,先问一下mysql的数据文件,存在磁盘,还存内存,知道吗,在我们看到文件的时候。
其实说白了它就是一个一个单独的数据文件,但是你注意了,你在换不同的存储引擎的时候,他们在磁盘上面的存储形式是不一样的,也就是说叫不同的数据文件,在磁盘的不同组织组织,形式好吧。
我们给他们起了一个统一的描述,或者统一的概述,叫做存储引擎,我举一个例子,你就明白了,很多同学可能经常看的是表,通过可视化工具直接看表了,你其实很少了解过这些对应的数据文件,那么在像这样的数据文件里面。
我们可以看一下,打开我电脑好,选择c盘,找到program date,找到mysql max,5。7找到date,我打开随便打开一个库,比如demo在这个库里面,或者在这个目录文件里面。
大家可以看到同名的文件,是不是有两个aa是同名文件,一个是farm,一个是ibd f rm表示什么意思,它表示存储的是表结构相关的一些原数据信息,而a b d表示什么意思,它表示存放的是我们的数据文件。
以及对应的索引文件,所以当你看到这样的一些东西的时候,就表示说当前aa这张表,我所使用的存储引擎用的是什么叫in low db,这种存储引擎,明白意思吧好吧,同样的我可以换另外的一个目录。
比如打开nsl这个目录,这个时候你同样看同名的文件包含几个三个嘛,好吧,后缀名名名称不一样,f2 m还是表示我们对应的表结构,而m y d表示是my sum的date文件date。
而m yi表示所属的是masm的index文件,他看到了在inno bb存储引擎里面,数据跟索引是放在一块的,而在我们当前的这个呃,怎么说这个masm里面,你的数据文件和所有文件就是分开存储的。
这是他们区别的,比如说你在使用不同存储引擎的时候,他们在磁盘里面实际存储的时候是不一样的,虽然都是以文件的方式来进行存储,但是不好意思,他们是不一样的,明白意思吧,来刚刚讲的东西。
能听懂的同学给老师扣一,哇这是整个体系的一个架构,当然有很多同学可能还会知道一个东西,说老师mysql里面不是还应该包含另外一个组件吗,什么组件在这块,这里面是不是还包含另外一个东西,叫做查询缓存啊。
什么叫查询缓存,这东西怎么去理解,非常简单的,比如说我从数据库里面查到一批数据,查完之后,我下次有可能还会再次查询,那这个事儿,我是如果能够在缓存里面放好数据的话,直接从缓存里面取就行了,是不是意思。
注意啊,这我说明一件事,在以前的版本的时候,mysgo确实有这样的一个查询缓存,这样的一个组件,但是注意了,八点以上版本,取消,所以这就没换了,为什么,因为它的数据命中率非常非常低。
好需要经常的更新里面的数据,所以这个东西被删掉了,直接给干掉了,所以大家也现在不需要去记这么个玩意儿,你大概了解有这个东西就可以了,好吧,旭东说,老师你画出了什么笔记,叫分页用笔记。
那个process on给大家说一下,之前我也用process on,但那个如果你不注册会员的话,只能画几张图片,有些东西叫分页用笔记,你可以用一下,这东西跟ptdown是一样的。
它里面也支持在线买一个客户端,你可以在里面画图,跟pton几乎一模一样,可以拿它来进行一个画图,好吧,是这样的东西啊,这个小工具你们可以用它不限制图片的个数。
不限制图片的个数,而且没有那种呃呃对应的一些充值的一些需要,这个没有啊,所以踏实的放开用就行了,ok好了,就刚刚我讲的一些mysql整体的一个架构,你把这东西首先要理解清楚了,当你把这东西理解清楚之后。
它有什么好处啊,好处就在于,我们可以在各个层次或在各个级别的时候,对mysql的一些东西进行举进行基本的了解,比如说同学们经常要在面试中,被问到优化的问题,当被问到优化问题的时候。
大部分同学会条件反射出来说,老师我要通过添加索引的方式来进行优化,那么我想问的时候,所以是怎么存储的,你不了解这样架构的时候,其实对于索引仪式很难理解的,再比如说刚刚我看到一个同学问我一个问题。
说老师方便的时候,一会儿讲了一个东西叫什么对,所以下推和索引覆盖它们两个之间的区别,那叫signal还叫什么,你叫signal吧,同学问的,所以下跌,所以我把那个索引覆盖的区别,你了解完这个架构之后。
你就会了解说什么叫覆盖,什么叫下推,好一会我都会讲,有这张图是一个预先了解的一个知识图,因为一会索引的时候,我们会用到对应的一个知识点,好吧,这是这些相关的东西啊,我是小白,不管你白不白。
系列 6:P83:MySQL的索引系统是如何设计的,为什么要使用B+树 - 马士兵学堂 - BV1RY4y1Q7DL
所以先把这个架构了解清楚了。
当把这东西搞清楚之后,下面我们来聊第二个问题,说mysql的索引系统是如何设计的,为什么要使用b加数。
下午的时候有一个同学在群里面也问到,这是逻辑架构吧,不会讲物理架构,不讲物理架构好吧,不讲物理架构,物理架构主要是它具体的一个搭建,比如分布式的时候,单机的要怎么搭建内容。
我想网盘里面就包含了这样的一些具体的组件,和完成具体的一个功能好吧,当你把这块东西搞明白之后,下面我们聊聊一下具体的索引,只要学的东西,我觉得所以他是一个老生常谈的一个话题了,基本上在面试过程中。
只要提到mysql,所以它会成为一个必备项,那么所以你们要考核的记录点其实非常非常多,就比如说我刚刚写的说,为什么要使用b加速这样的一个数据结构,当然很多同学可能在之前的时候,你看过一些帖子。
看过一些撕掉哦,你知道了他就要使用变压数,但我还是希望同学们能够系统地把它了解一下,那作为我们学习者,我应该怎么去学习,你可以来想一下,如果让你自己来设计一套mysql的索引系统,你会怎么来设计。
你要多几次这样的思考,你多这样思考之后,你后面看问题的角度是不同的,我来问一下吧,假如说让你自己来设计到索引系统,你会怎么来设计,告诉我你的思路是什么,你们咋设计啊,首先设计是什么,明确一件事啊。
所以你存在的意义是什么,你上来就用数据结构,你上来好好显明,你上来就说用数据结构树形结构是不对的,你刚开始不可能一口就想到这个地方,首先明确一件事,我在进行索引或添加索引的时候,你要考这件事。
索引的意义是什么,叫加快数据来加快,数据访问,对吧,哎房子提高查询项目,这都是我们随随便便说了两句话,那你要考虑一件事了,我们的数据最终存储在什么地方,刚刚我也问了,数据存储在磁盘,对不对。
但是你如果存在磁盘的话,你就要考虑一件事了,从磁盘里面读取数据,但效率是高还是低,比如内存和磁盘在进行数据交互的时候,它的效率是高还是低啊,对吧对吧,从c盘读取数据效率低,特别是你在读取大量数据的时候。
效率是不是依然很低,因为这些东西说白了它卡在瓶颈,是卡在软件层面吗,是平面,是卡在软件层面吗,不是这卡在硬件层面io,就我经常举个例子,我说同学们,如果你们买了新电脑之后,但凡家里有点条件。
是不是要把你的机械硬盘换成ssd固态硬盘,为什么速度快吗,是速度快了对吧,这是硬件方面的瓶颈,我们是没办法解决的,但是我在进行软件设计的时候,能不能在一定程度上对我们的ia操作,进行相关的优化。
可以在优化的时候,你是不是可以考虑两个层面,或者说两个维度,第一个维度我能不能去尽可能少的读取数据,也就是说减少i o亮可不可以,比如说本来我只需要实战数据,我需要实战,我就读十张,绝对不读11章。
可不可以,你多不同大小数据量,你的性能损耗一定是不一样的,对不对,第一个减少io量,除了减少io量之外,第二个能不能考虑一件事情,减少i o次数,什么叫减少io次数,你的数据是存储在磁盘的。
从磁盘里面读取数据的时候,是要涉及到词b的移动,或者说寻址的一个时间的,这都是太浪费时间的一个点,所以我能不能,如果说我能一次性读取来的数据,我就不要读两次,是这意思。
所以这是不是我们在进行软件设计的时候,会在进行一些基本操作的时候,我们应该尽可能考虑的一个点来,这些能听明白的,给老师扣个一,能听懂吗,好了,当你把这东西有了前提之后,下面我们就要开始进行思考了。
思考啥,所以要加快数据访问,同时要减少io量,减少io次数,那我要怎么去设计它,它存储io市场,io市场,input output,好吧,有时候我们要进行所有的设计来。
要考虑说我到底要怎么去存储我们数数据的,一个就是说哎和下面这些东西了解清楚后,我们要考虑,我们索引到底要存储什么样的数据文件吗,或者这样说索引,把数据格式是什么,什么叫数据格式。
比如说我应该用什么样的方式去存储,我们的索引,大家想一下,你的数据是放在一个非常非常大的文件里面的,在这个文件里面包含了一行一行的记录,不画了,可能有n多行,一行一行记录对吧,这么多行记录。
我如何去直接定位到我想要的数据,它在哪一个位置呢,并且如何能够把对应的数据位置给读取,得读取出来呢,那这时候我应该怎么考虑,比如说我应该选择什么的数据格式,来存储数据的,比如说一个表1000万。
我想读进六六百93条文要怎么存哈,希哈希能取吗,这样叫数据格式,大家想你们在创建索引的时候,是不是一定有一个k值,每次是不是根据那个k值,我找到了整行的value值,是这样做的。
所以我在实际的一个存储的时候,能做这样一个实现什么实现,我用kv格式的数据能不能完成这件事情,k是什么,k就是我们对应的字段信息对吧,那value是什么呢,value也非常简单。
我的数据是存储在文件里面的,我能不能指定好我具体在哪一个文件,有文件网名称以及还需要啥,别忘了你是需要读取我们对应数据文件的,你除了知道这个数据要放在哪个文件里面之外,还要知道什么。
磁盘地址我们换一个描述,天一亮,可以吧,纯纯说的我们能不能知道偏移量,当我知道我们对应的文件名称了,知道我的偏移量了,我是不是能把我们当前的数据给读取回来,与此同时,我还要还需要知道什么东西。
如果你想加的话,还需要知道读取的什么数据长度吧,当我明确好这些信息之后,我能不能把一条数据给定向的取回来,能还是不能,能同学们,如果我知道这样的信息,别自然信息就自带池,当我知道一个值之后。
我就可以定位到某某一个文件,然后定位到偏移量,定位到数据长度,我是不是就可以把整条数据给读回来了,好吧,但是我们之前说过了,mexico,他用的是b加数,而没有用这样的一种格式,为什么原因在什么地方。
他为什么不选择这样的结构呢,同学们,这样的方式会存在一个非常非常大的问题,是什么,当你的数据文件变得越来越大的时候,你当前存储索引的文件,有没有可能也会变得非常非常大,听描述啊。
当你的数据文件变得非常非常大的时候,你当前的索引文件,是不是有可能变得非常非常大,当你当前的索引文件也变得非常大的时候,那我是不是还有必要在索引文件的前面,我再给他建一个索引,我再给他建一个索引。
我再给建一个索引,这没有头了,这东西永远结束不了了,这明显是不合适的,对不对,所以这些东西它不适合什么意思,当数据原件变多,这时候索引文件也会变大,所以为什么会变大,大哥,你索引是字段的值。
你现在有原来是1000万条,1000万,现在变成一个亿了,你表里面的数据量增大了十倍,你所有的东西能不变吗,你所以不会跟着涨吗,这个green shadow绿眼混干面吗,当数据文件表多的时候。
表变多不是表多,变多的时候,你的所有文件也会与时俱进的跟着变大,那这样的话你当前你的数据结构就你这怎么说,但是将会变得越来越大,你在前面还要建索引,这很明显是不合适的,明白意思吧,原谅一个不是绿的吗。
是不是意思是就算你存一个指针也是一样的,你的所有文件是要一直与日俱增的,所以这种结构是不可以的吧,而且其实最关键的是是啥,你变大其实也没关系,也没关系,这里面涉及到一个核心概念或是两个东西。
我需要同学们了解一下第一个东西叫什么,叫o l a p,第二个东西,叫lol tp,我不知你的同学听过听过这样的东西,听过吗,听过的扣一,没听过的扣二,有没有听过这啥玩意儿,op叫联机。
分析处理l o l t名叫什么,叫连接事物,处理他们两个针对的应用场景是不一样的,像o r a p它有什么作用呢,它主要是对历史数据进行分析,产生决策影响啊,不要求短时间内返回结果。
而我们的联机事务处理是什么意思,叫支撑业务,系统的需要,需要在短时间内返回对应的数据结果,所以当我这个文件如果变大之后,注意了哈,无法在短时间之内返回我们对应的数据,所以它是会有问题的。
而第二个叫o r a p,它对应过来的应用场景是什么,有些东西叫数据仓库,而我们的连接事故处理,它对应过来是什么叫数据库,他们俩之间的一个区别,所以像我们讲的mexico它属于什么。
它属于关系型的数据库,然后刚刚说的have这玩意儿,它属于什么叫数据仓库,所以在ham里面,它确确实实的索引就是以这样的方式来存在的,但是没关系,我反正也不要求你,很快时间之内我返回对应的结果。
慢慢查了就行了,而mexico是没办法的,他必须要求在秒级别或者毫秒级别,给你返回对应的数据,所以这种写的时候他就不行了,能听懂吗,这些点能听明白的,给老师扣个一,能听懂,不,并不是说他不行他行。
只不过对于我们当前这种应用场景或这种需求,还用不到,或者没法用面试,既然是这样的方式不行的话,我们现在明确的说我要存储kv格式的数据,那我就要考虑下面一件事了,什么事存储k v格式的时候。
可以杠v格式数据的时候,需要使用什么数据结构,数据的存储形式我们确定下来了,那下面我们就要考虑对应的数据结构了,我问一下,你了解的有哪些数据结构,可以支持kv格式的数据存,储,哪些,换一个描述吧。
还细表好不好,传奇掉对吧,还有吗,能做到二叉树对吧,红黑树,对不对,看到吗,release你你mysql的索引用redis来实现,咋整啊,开头说的b数对吧,然后才知道b加数,我们都知道在最后环节的时候。
b加数胜出了,前面几个数都不行,下面我们来分析一下,为什么前面几个数它有问题或者他不行,你要把他们的原因搞清楚,为什么这些数据结构不行,为什么b加数就可以,其实通过上面的分析啊,通过这些分析的时候。
同学们能得到一个结论,什么结论,也就是说随着我们数据量的增长,你所有的数据量也是与日俱增的,也是与日俱增的,那同时你要考虑一件事,我有没有可能一口气把磁盘里面的,所有的数据文件。
全部都一口气读取到内存里面去听,有问题啊,随着你的数据量的增长,你的索引这数据量也在增长,我有没有可能把所有的书索引文件,一口气全部读取到内存里面,你懂了吗,不太可能对不对,或者没有可能对不对。
如果没有可能的话,基于这样的场景,我们要思考什么事情,如果我一口气读不下来,那我可以考虑怎么读,怎么读对,就是我想听你说,这东西分段也行,分块也行,叫分块,分块,读取,这也是mysql所有系统里面。
一个非常非常重要的东西,叫分块读取,分块读取,什么叫分块读取,这里面其实有一个设计思想,同学们听一下,叫孙而治之,很多大数据的设计里面都会用到这样的东西,叫分而治之,比如说我们在进行数据读取的时候。
也要保证它能够分块去读取数据,只要还能够分块读取了,那么你的效率是有可能会进行一个提升的,联合件提升的这东西我们形成一边,一会再详细聊分块这件事情,治疗综合这件事情,我们接下来解释这几个数据结构。
它到底有什么区别,以及为什么最终我们选择了b加数,这样数据结构,先看第一个哈希表哈,希表我们就不用我解释了哈,希表长什么样子啊,都知道吧,来画个图吧,来看看它里面长什么样子,上面是我们对应的一个数组吧。
下面是我们链表,然后这是有指针指向的,然后在输入里面我们可以写我们下标从零开始,1234567对吧,这里面可以存储我们具体的一个数据结果值,那这些东西搞清楚之后,我们先要思考一件事了,为什么哈希表不行。
或者说哈希表它到底存在什么样的一个问题,你把问题找到了,你才能定向的去解决我们这里面的一些疑惑啊,还有什么问题吗,有吧,第一个使用焊锡表,的意义是为了让数据尽可能尽可能的散列,因此在使用,哈希表的时候。
要选择合适的,什么叫哈希算法,避免哈希碰撞和哈希冲突吧,是不是意思,像我刚刚画了一张表,如果我这个都是一个完整的哈希表的话,你发现它的数据散列均匀吗,看数据产业就业吗,不均匀吧。
你看到了1号和3号里面有数据,但是024674567应该都没有数据,他浪费了很多的存储空间,是不是意思,而且如果你的数据都集中在,1号位和3号位置的话,链表它是需要按个遍历迭代的。
它的调音参数效率会降低好吧,所以这个哈希算法它是一个非常大的考验,这个其实还不是太重要的,最主要的一件事是什么,我问一下pc表在进行数据存储的时候,它里面的数据是有序的还是无序的,有序还是无序。
无序吧存储的数,有t吗,这同学是要点吗,还是表示这个同学还是表示有序的吗,无序啊哈希表存储的数据结构,它是无序的,当需要进行范围查询的时候怎么办,只能挨个进行便利,对比是效率极低,那这时候你想你工作中。
你工作中所对应的那个范围查询多吗,多吧是不是很多,如果你都是范围查询的话,你有话题表达行吗,不可以的不可以了好吧,还有第三个点是什么,对我问一下pc版在读取数据的时候,我能一块一块读吗。
他先表在读取数据的时候,我能一块一块去进行数据的读取吗,不能吧,这是不是也会存在对应的问题,是不是有病的问题,所以这些东西都不太适合我使用,我们的哈希表啊,但是我要说明的一件事是什么。
虽然说哈希表没有作为我们哈希索引的一个存,储索引的一个存储存储的数据结构,但是mysql里面它有没有哈希索引,有没有,有啊有啊,来说一下mysql中的memory存储引擎知识,哈希。
所以啊同时还有一部戏叫inno db存储引擎支持,叫自适应哈希什么叫自适应滑行啊,就这个这个这个过程它不是由人未来干预的,是由mysql的索引,是由mico的服务自己来断定的,而不是我们来判定好的。
明白意思吧,而不是我们来判定好的,所以这个东西你要考虑清楚了,这块也不是我说的是mysql官网里面来说的,我们来看一下,注意啊,你们在选择官网,选择这个资料学习的时候啊,官网就是最好的资料。
做一手资料里面都有相关的描述,对数量少就用花西,数量多的话就不用花西了,是他自己来操作的,人为是没办法去进行干预的,明白吗,人为干预不了的,来选择5。7吧,我们现在是5。7版本的,在5。7版本里面。
我们找一个mysql的索引的模块,找一下,就这样东西说了,most mexico index好吧,像primary ket,uniqual index,fda store in b杠tra。
这显示的是b数,但实际上指的是你能用什么是b加数好吧,然后往下看,下面有个东西,memory table outsport has seen index好吧。
memory but also smart hash index,百度搞清楚可以了好吧,把字搞清楚就可以了,所以一般情况下我们用的不加数,但是在memory存储引擎里面支持哈希索引。
同时intedv自持支持这个自适应刷新好吧,然后那个同学说对啊,那个建档的时候他会自己选择我们存储引擎,我问一下mysql现在默认的存储引擎是啥,默认的存储引擎是啥,pp移动db运动db,你懂db。
反正搞清楚行吗好吧,这是这个东西,来,下面来我们接着聊哈,希表不行了吧,他现在不行的话,我们下面就要换各种数的结构了吧,我这儿给大家列几个数,你看看好吧,某某人的什么意思,学会看官网好吧。
官网里面有很多对应的一些资料是标准答案,一定要看官网来,我们现在说几个数的东西好吧,刚才提到二叉树对吧,我让他再补充几个,比如说除了他之外,还有个东西叫b s t tra对吧,除了b s t税之外。
后面还有个东西叫a v l数,除了a v l数之外,下面还有一个东西叫红黑树,我先把这几个数据结构融入到一块啊,这几个数据结构,在常规的数据结构的一个考核中,应该问的是比较多的吧,面试中文的也比较多。
你需要对这些东西有所了解,有所掌握,很重要啊,谁说我这几个数据结构不清楚的话,这插播一个广告,谁如果对数据结构和算法东西不清楚的话,可以去学习一下左神左程云老师讲的,数据结构和算法的课程。
有人知道做什么,左晨宇老师,左晨曦老师啊,在马士兵教育,全职讲对应的数据结构和算法的课程,所以谁如果对数据结构,算法相关的东西有疑惑的话,直接导组成哇,贼牛逼对,确实很牛逼好吧,大家可以搜一下。
就成为那个人对,昨天晚上刚上完公开课好吧,所以差不多广告,呵呵好吧,我这儿啊不详细去讲这些对应的数据结构,它具体每个的特点是什么,我只给大家总结几个东西,首先先看这样,我罗列出来四个数,b数和b加数。
我是没写的,我先把这几个数罗列到这样看,那四个你告诉我有什么共同的特点,有特点吗,都是数你,你这话说还能再再再再那啥点啊,都是数,这最多只能有两个两个分支,没问题吧啊最多只能有两个分支。
是他们这四个数对应的特点,同时我会慢慢的缩小我们对应的范围,那后面这三个数是什么,这一个bs t tra啊,什么叫bs t tra啊,叫binary search tree,二叉搜索树好吧。
那后面这三个数它有什么特点,什么样,叫有序有序,后面一个数都是有顺序的好吧,左子数必须要小于根节点,右子数必须要大于根节点对吧,就是这个,那现在再来,还有下面这个东西,后面这两个它们具备什么特点。
对叫平衡平衡,这是他们对应的一系列的一个特性哦,我这儿给大家做一个简单的小总结,他们之间的一个区别以及对应的一些特点,那讲完这个东西之后,下面我们要聊什么,聊一个话题,所有人应该都知道二叉树长成的样子。
他们都有两个分支嘛,好吧都有序嘛,有可能会平衡嘛对吧,那什么叫二叉树啊,它怎么排列的,一个节点里面至多只能有两个字节点,我把这个东西补全,当我补全之后,大家其实可以看到当前数的一个样子,来放到这儿。
好了我连线我就不连了,假设这是我们对应三层的一个数吧,三层1233层三层的一个这样的数据结构,我问一下,存满之后至多能存储多少条数据,多少,是多啊是多,如果都存档的话,能吃几条数据,二三次方减一七条吧。
是不是纯白只能放弃上,你数一下都来得及,1234567嘛,这都不能放弃上数据,如果只能放七条数据的话,这里面会有一个问题,什么问题,如果我想存储更多的数据的话,应该怎么办。
比如说暗杀数在存满的情况下是制作制度,只能存储七条结果,如果想存储,更多的数据怎么办,只能将树的,的高度提高吧,提高变成四层,或者五层,或者更多层,那么层数变多了会有什么影响呢,刘老师,那变高就变高呗。
变高又怎么样,为什么不能让变高呢,变高会有什么影响,会有会有会有什么影响吗,有没有,速度慢,命中低好了,刚刚没有名字,这个同学说了一句话,叫io次数会变多,会涉及到一个数据结构工程。
不是涉及到一个操作系统里面相关的知识点,这样我要给大家说明一下什么东西,有没有人听过一个名词,什么意思呢,叫做磁盘预读,来听过的扣一,没听过的扣二,老师你怎么光讲这些新鲜名词啊,我都没听过这东西。
没听过,说明你技术有短板了,需要把这东西磨练起来,什么叫磁盘预读,注意一件事,就是内存跟磁盘进行数据交互的时候,有一个最基本的逻辑单位是称之为e或者叫做,你们能听过data配置能清过吗。
叫data page或者叫ye的大小是跟操作系统相关的,一般是四kb或者八kb好我们再进行,数据读取,这时候一般操作的都是列的整数倍,这个概念我希望大家能够理解,听到了吗,这是我需要你了解的一个。
最最最基础的一个基本概念,你把这个概念了解了,后面的东西才能往下聊,没问题吧,大家想一下,当我这儿已经有了一个页的东西了,也就是说内存和磁盘交互的时候,是有一个单位的。
这个时候你再把它跟我们前面讲的这个东西,能不能关联起来,我们先说了,这东西在进行数据读取的时候,要进行分块读取吧,既然诶怎么连不过来,是要进行分块读取,我现在要分块读取。
你想一下我们这个业的单位或页大小,不就天然已经分好块了吗,我能不能每次我就读四kb大小,能不能挺好,我能不能每次就读四kb大小,行不行,可以了,这不就天然就已经分好块了吗是吧,但是别忘了。
我们在进行数据的一个实际存储的时候,它是以页为单位进行交互的,像你这个地方,这是一个节点,一个节点是不是意味着我要读取一个月的数据,但是我们都知道,这里面明显我只能存放一个值吧,比如这是十,这是五。
这是15,这只能放三,再放八小七,这放12,这放19,是不是讲讲成这样的东西,因为每一块里面或者每一个节点里面,你是不是只能存放一个数据值,你这个节点里面我能存储更多的数据结果值吗,能吗,同学们,能啊。
你这里面能放多个值吗,你怎么放,看只有两个分支,要不然比他大小比他小,你能放多个分支吗,你是放不了的,如果你放不了的话,你就要考虑一件事,这里面有一页的一个单位了,那我如果有一页这样一个单位之后。
我如果存不满怎么办,存档会放其他东西吗,来举个例子来验证一下,打开我的电脑,这里面我新建一个文档,举个例子就知道了,这是一个文本文档里面现在什么都没有空的,我现在往里面随便复制一点东西,随便带点。
ctrl c ctrl v,你告诉我这里面有多少个字节,再加点多少字节告诉我,你知道吗,我也不知道多少字节好吧,你右击点击属性,你看到了多少字节,一共是1198个字节,但是它占用的空间是多少。
对4k b吧,你相当于你的磁盘,是不是都一个一个4k的小格子,如果我占不满的话,不好意思,占不满就占不满吗,这空着不就完了吗,是不是这意思啊,所以你想我们这里面每一个节点,如果我只能存储一个数据值的话。
我如果想让它存储更多数据的话,我是不是要加层,我如果加成的话,每一个层或者每一个节点里面读取的时候,我都是一页的话,你层数加多了,你层数加工了,你告诉我,你最后能会不会导致你的io量变多,会不会。
老同学们会不会,别关注壁纸好不好,关注壁纸干嘛,你们真的是,这壁纸我发给你了,好吧,这壁纸有什么可关注的,真的是绝了,你们也是,所以啊我们要考虑一件事,同学们什么事,为什么你的层数变高之后。
你的io次数是变多,这是产生最根本的一个原因,所以你要考虑一件事,什么事考虑什么,是不是要尽可能,多的存储数据还要减少i o的次数,换句话说是不是要减少io的,我会减少树的高度吧,是不是减少高速度高度。
这句话能理解吗,来能理解的同学给老师扣一,所以说不能越高,如果不能越高的话,你想这个数我们能变形吗,或者我们这个数能变种吗,可以吗,怎么变形,每一个阶里面我是放了一个值。
如果我的一个阶里面我如果能放多个值呢,颜值放一个十甲里面放十多号,20多号30,如果我放了三个值,你告诉我我下面的子节点,子节点会放几个,或者说会有几个孩子节点,这个六个,你哪来六个大哥这一层啊。
说这一层,两个我能犯这样的范围,第一个范围小于十可以吗,第二范围我能换成十,到20之间,可以吧,下一个我能放20~30,对吧,再下一个,我能放30,大于30的,可以吧。
我是不是可以存到我们对应四个区间了,比如说原来我现在是二叉树,我能不能让当前的这个结构,它变形或者变种一下,变成什么东西,叫多差数可以吗,可不可以,这没问题吧,当你变成多叉树之后。
是不是意味着你的孩子几点变多了,你的孩子几点变动之后,你的树是不是就变矮了,同时我这里面在进行数据存储的时候,该有序还有序对吧,该平衡你还平衡,把你之前那些二叉数这些特点我都保留下来。
所以在这个东西的基础之上慢慢变过渡之后,变成了一个什么东西,叫b数,叫b数,你是要把b数这玩意儿搞清楚了,b数是吧,来到目前为止还能跟上同学给老师扣一,能跟上吗,平衡板上的树高。
最最长指数和最短指数之差不能超过一,是那个a b l数的红黑数的话是两倍,这个不一样啊,这不一样好吧,现在把这些东西你要搞清楚了啊,这是b数,那我们现在来看一下b数的一个结构,它大概长什么样子。
很多学啊可能没见过b数长什么样子,没关系,我们一起来看一下,b数结构大概是这样一个东西,首先你在进行b数的一个实际数据存储的时候,需要搞明白一件事,什么事,它有一个最基本的概念叫做什么叫做degree。
这个diy怎么翻译呢,翻译过来叫做do,或者叫做接好do或者接什么叫do,什么叫接,表示每一个节点里面最多存放n多,n减一条数据来看一下,比如说选择四阶,四阶什么意思,每一个节点里面我可以放三条数据。
我们可以往里面插一下,你看看效果好吧,比上一走,这是一点点,我再插入二,它不会新增节点,而是往当前节点里面插入其他的一些数据值,再比如三看到往里面加每个里面因为选了四阶,最多能存放n减一个。
所以最多能放三个数据,当我再插入四这个数据的时候,它就要分裂了,看到了吗,这就进行分裂了,速度调快一点,我再往里面查看,比如说56x6 的时候,他遇到进行分裂了,再叉七差八分裂,那差一个九没事。
当我再插一个十之后,同学们告诉我什么效果,当我再插入一个十这个数据的时候,它有什么样一个效果啊,圆满了,你插20的时候,下面也要满吗,下面是不是要满了啊,它会变成一个三层的数,这是我们对应的一个b数。
对应倍数,看到了吗,这是最基础和最简单的一个数据结构吧,啊你把这东西搞清楚了,没完,还需要懂这件事什么,它只是一个最基本的数据结构的一个模型,它你知道它是没意义的,我需要把这个模型做一个过渡。
过渡是什么样子,我要存放我们数据库里面的表,里面的行记录了,所以这看起来好像是一个数值,那么我们在实际存储我们的行数据的时候,它不可能存存放一个数值,比如说这个节点往里面添换的时候。
这个值要变成几种类型的数据,首先第一个存放数据的时候,k值要有吧,k值不可能没有,k值是必须要有的,是不是意思,截图,来同学们听好了,我k值是不是要用,也是这里面我可以存储三个类型的数据。
第一个k值要什么,你需要根据你的k值来检索到我对应的数据啊,是不是在哪个地方ky要有吗,除了ky之外,你能告诉我你还需要别的数据吗,我说了啊,这是数据模型的图,我们要把它换成我们一张表。
还需要什么东西叫啥,字段信息行数据吧,行数据,还需要啥,还需要吗,value value不是行数据吗,还需要什么东西,同学们别忘了它是我们对应的数,下面是有对应的节点的。
我是不是要知道我下一个读取的数据,节点的地址是什么,下一个节点的地址,这样的东西如果你是六组利用小于六的,是不是读取五这块儿六和八之间的时候都是七,这个块大于八,读取这块这个地址。
这里面我们会包含三种类型的数据,所以你需要先把这东西搞清楚,你把这东西搞清楚之后,你就可以跟着他来画出一张图,什么图,关于我们索引的数据结构,一张图来给大家看一下。
这之前用process on的时候给大家画了一些图啊,我没挪啊,还在里边放着,找到我的msl,来你看这张图,你能不能看懂。
每一个磁盘块,就代表是我们读取的n个页的信息,我说了吗,每次在进行数据交互的时候,读取的是e的整数倍,把每个方块表示独一个页的整数倍,默认这读的是假设是16kb。
每个方块12345678 90是多少次方块,当我练好这个磁盘块之后,每个磁盘块里面是包含三种类型的数据,第一个16 34表示我们具体的k值对吧,data表示我们实际的行数据。
p1 p2 p3 表示我们实际的指针,我这啊只画了三个范围,但其实实际存储的时候,你的范围可能比这些东西要多得多,可能很多个,但是空间有限,所以我这只画了三个来,这个图能不能看懂,能看懂的扣一好不好。
没问题吧,这如果没问题之后,下面当你看到这样的一个三层的数之后,三层数之后我要问问题了,如果我要读取28这条数据的话,a a b等于28条数据的话,我要怎么去读取,记住啊,28怎么读。
我是不是先读取磁盘块一,把磁盘块一给读取回来,读取过来之后,我要把28和36和34做对比,我一对比发现诶正好在中间,是不是沿着p2 指针把磁方块三给读取回来,当我把磁盘块三读取回来之后。
我再把28和25和31度对比,但是又好正好在中间,我是不是再根据p2 指针把磁盘块八给读回来,当我读出来之后,我是不是能把28条数据给返回回去了,这里面它整体的一个查找过程,在整个查找过程中。
我一共读取了几个四方块,三个吧是不是三个同学们注意一件事,出现什么事情,在mysql in no db的存储引擎里面,它有一个变量受,角in no bb象限配置上限size。
你这样属性值g值多少,它默认读取的是16kb的数据,默认读取16频率的数据,也就是说这样假设我们每一个磁盘块。
每个磁盘块它占大小是16k,我在整体读取过程中,我一共读了多大的数据量,多大的数据量,一共,不大是不是一共是48kb的数据,这个48kb对于我们现在的操作系统而言,很小的数据量吗。
像你们的电脑基本上8g内存起步吧,我始终给内存起步吧对吧,有些更有钱的同学可能配上32g内存,64g内存,是不是意思,他应该是比较简单的哇,48k很少完了,这样对于我们的内存的四点而言并不是特别高。
那下面你就要考虑另外一件事了,同学们16级不算大好吧,我给你看我电脑内存多大,64g好吧,你这个大点没关系的,越大越快好吧,这也没关系的,来往上看,我们再往下看,我们接着往下走啊。
当你把这东西搞清楚之后,你下面就要思考一件事,思考一件事的思考什么事,我如果b加数对,不是这个b数,它只有三层,我存满了之后记住啊,存满了之后,我可以存多少条数据,存满之后存多少数据,你告诉我能计算吗。
八是什么意思,我们是不是可以大概算一下,我们为了方便计算,假设一个z我占了大小是一kb,我问一下,在当前这个磁盘块里面,我最多能有几个子节点,最多能有几个直接,三个我这换了三个,你一个大小是16kb。
一个date是一kb,我最多可以存多少个,你data是不是只能占一kb上面是不是占范围,也说你最多有15个date,15个date相当于16个范围吧,是不是六个范围,是不是,这意思。
就是说我这一层里面最多可以有16个子节点,那我第二层我可以有多少子节点,第二层多少个,也是16个吧,是不是也是16个,第一层16个子地点,第二层是不是也是16个子地点,大小是一样的吗,第三层多少个。
是不是也是16个,一个dt 1 k兵马,也就是说如果我这三层全部全部我都存满了,我的计算公式应该是什么样子,应该是16乘,16x16=4096条记录啊,这等于四是多少,那么我的问题是什么。
4000条数据多还是少,多还是少,说吧,你平常自己做个练习都不止4000条记录,那如果我想存储更多的结果的话,我应该怎么办,怎么办,我是不是只能去加我们的层次了,比如说把三层的一棵树变成四层。
是不是这意思,但是很明显的一件事,朋友们你要注意了,如果我要把三层变成四层的话,我的i o的次数会不会变多,会还是不会会不会会吧,那这跟我们的设计原则又相悖了,那这时候我们要找问题了,找出问题。
为什么这个三层的b数它只能存4000条数据,谁占用了大量的存储空间,谁,date吧,那下面我就要思考一件事,我能不能把data给干掉了,对不对,所以在b数的基础之上,有了另外一个东西叫b加数,来。
我们先看b加数的数据结构,我依然往里面插入一到十十个数据,你再对比一下区别好吧,一三还是三个,四的时候变了,然后56789,传输十十个数据之后,依然是底层三层吧,我把这个图拿过来放里边,当我放过来之后。
来告诉我他们之间的区别是什么,开始找不同有什么区别吗,什么区别,同学们,箭头哈哈哈哈,最下面一层有了一个指针,或者有一个链表的指针,能够相互指向,还有吗,这边最主要的看到没有,最下层的数据最多。
患者描述呢,看好相应的区别和特点,所有在b处的时候,我们的数据是12345678 90,看数据没有重复,但在b加速的时候,叶子烟里面是包含了全量的数据,而非页里面是包含了部分数据,那通过它的对比之后。
是不是相当于有了一定的数据的冗余,当有冗余之后,我们可以思考一件什么事儿,我能不能把刚刚这个图里面的所有的date,都放到叶子节点里面去,能还是不能,你能吧,所以我在变形之后。
我能不能有这样的一张图来看好了。
还是等,来这个图你们能看懂吗,什么意思,我的非叶子节点里面不再存储实际的数据,只有在夜间里面才会存储实际的数据,这么干行不行,行吗,可以吗,如果可以的话,一样道理,我们要进行计算了,我计算什么东西。
这样的一个三层的b加数,我如果存满的话,我可以支持多少数据量的存储,算一算吧,每一个三方块依然是16k 16 k 16 k,我读取的时候依然是读取了48kb的数据,对吧,假设我们的p一加28。
我占了十个字节,记住吧,假设你占十个字节,那相当于16x1024,再除以十,为了方便计算,24不要了,1000等于多少,1600吧,比如18号一,我可以有1600个子节点,第二层一样的算法。
是不是也是1600个子节点,第三层一个date 1 kb,是不是只能存16条,你这三层的一个b加数,如果我存满的话,我可以吃多少,1600x1600,再乘以16,等于4096万。
是不是意思我能知道多少范围是这样了,烂级别吧,是不是意思,来刚刚能听的过程能听明白,同学表示扣个一,问题吧,当你把这套东西看明白之后,与生俱来的就会面试官问出一个问题,mysqb加数的,所以一般是几层。
告诉我一般是几层,三层不问不问就不问呗,不问怎么办,那还能怎么办,你打面试官一顿问就不问呗,三层吧,四层吧,告诉大家,你说三层也好,说四层也好,个人认为都不是那么的严谨啊,都不是那么的严谨。
我这儿给大家一个统一的描述,听好了,听好了挺好,一般情况下,34层的b加数,足以支撑千万级别的数据量存储,来再来一遍,一般情况下,34层的b加数,足以支撑千万级别的数据量存储,能记住这句话吗。
面试官在问的时候,你就以这样的方式去给他进行表述,给他进行回答,没问题了,明白意思吧,因为在刚刚整个计算的公式里面,在计算的公式里面,你告诉我谁占了绝大的一个因素,或谁占了一个很大的因素,谁啊。
这吗是这吗,不要再理解为data了,好吧,是指针吗,大哥们别忘了我刚刚说的东西,我说假设p一和28占十个字节,指针的大小是不变的,而这个值是你选择的索引,只选索引列的值,这个值是有可能会变化的。
所以影响最大是谁是k这个值,假设我刚刚举个例子啊,如果我们的p和指针和p一和28,占了100个字节,你依然按照刚刚的公式算的话,变成多少了,是160x160x16,就变成了多少,409600,明白了吗。
所以谁在整个计算过程中,一对对这个这个意义非常重大,是k的值大小或者k所占用的存储空间大小,你告诉我k是大了好还是小了好,大号还是小号吗,小所以要保证一件事,保证什么k要尽可能少的占用存储空间。
明白意思吧,那这样就会有一个问题,我们在创建索引列的时候,我会用int类型好,还是用what串类型好,哪个好,int int占四个字节,但是vx所占用的字节是你自己指定的吧,如果往上站三个呢。
如果你写了三呢,但我们一般不写三了,如果你写了三呢,所以要判断什么,谁占用的空间小,我就要用哪个列作为索引,听明白了吗,就这样你要考虑清楚了,来我刚刚讲了点,听明白同学多少科目,一听白了吗,好吧。
当这个问题过了之后,面试官又会问一个问题,什么问题什么问题啊,我们的mysql的表在进行创建的时候,我的组件要不要自增,你看这张图来给我反馈,要不要自尊,你来告诉我,也说不要的,有说要你不管说要也好。
还是说不要也好,我希望你能搞明白一件事,什么事,原因是啥,你说要以前说不要以前你总要有个理由吧,占用空间小,那么我先说结论,结论是这样的,在满足业务系统的支撑的情况下,尽可能的自增。
尽可能自动叫满足业务系统情况自动自增,为什么这里面会涉及到另外的一个问题,叫什么叫索引的维护,这玩意儿很麻烦,什么叫所有的维护,举个例子来看,四八块五,15,假设18块五,我最多只能放四条记录。
比如现在我已经存满了,11 12 12 13 15,我存满了,当我存满了之后,我的问题是什么,现在我要插一条14的记录,我该怎么插,因为你底层的叶子节点之间它是有顺序对吧,有序的。
所以你的14只能插到这个里面去,那我需要干嘛,把当前的方块要拆分成两个磁盘块,11 12在这13 15在这,当你分开之后,同学们注意了,你不是单单分开就完事儿了,你上层是要有指针指下来的。
意味着上层我也需要增加一个指针,如果这个时候特别不巧,他也满了,他满了之后,他是不是也要分裂成两个,但是还要往上增,就说你在进行数据插入的时候,有可能会影响到上层的一个新增吧,业的分裂吧。
这东西是很麻烦的,而如果你递增之后会有什么效果,是往后面追加就可以了,前面会有影响吗,前面的东西会产生液分裂吗,不会了吧,是这意思啊,所以我说了,在满足业务系统的情况下,尽可能自增,刘老师。
我分配的环境里面没法自证,那就不自增了吗,对不对,能自成就自身不能自动算了,我放弃了好不好,来刚刚讲解听明白,同学给老师扣个一,神组是用分布式id嘛,小号算法吗,用小号算法都分布式id吗,rest好吧。
所以刚刚是用索引的这套知识,所以这时候再回过头来来,你告诉我为什么要使用b加数,能听明白了吗,能听明白了吗,我刚才讲了一堆。
你要搞明白这个逻辑过程吗,面试的时候把这些点给面试官去陈述清楚哦,这里面涉及的东西还是挺多的,数据结构的,操作系统的网都有涉及到,包括他数据读取的多了去了,这东西了解了。
才能展示出来你个人的一个技术实力啊,这才是你最应该学的明白了吧,好了。
系列 6:P84:聚簇索引、二级索引和联合索引具备哪些特点 - 马士兵学堂 - BV1RY4y1Q7DL
那咱们就过了,过了之后来聊下一个话题是吗,说剧组索引。
二级索引和联合索引,它们具备什么样的一些特点,什么叫剧组索引,什么叫联合索引,什么叫二级索引,记住,对,二级,所以还有一个叫联合索引,哇这三个对应的点抽根烟抽根,那这个普通表行记录大黄进度大的话。
插入上亿数据会失败的,失败应该不会啊,失败应该不会啊,但是数量越大的话,你的查询效率肯定会降低的好吧,来我们来解释几个概念嗯,给大家你算了,不给时间,给他一分钟时间吗,给你们一分钟时间,我点根烟。
你们上个厕所好不好,现在是28 两分钟吧,我们九点半接着讲,上厕所去好吧,上厕所去,一会儿我们接着讲下一个话题啊,叶子节点包含了完整的行记录,对叶子节点包含了完整的行记录,是的,李老师有回放吗,呃回放。
我也不知道有没有啊,我这没录啊,就确定对着呢,没问题好吧,是包含的,但是这东西啊你要说你要说完全包含,也也不能说完全对,为什么一会儿我讲到这个二级索引的时候,你就知道了,二级索引和普及索引它是有区别的。
像二级索引里面就不一定不一定好吧,一会儿来解释,算了算了,李老师,这回放我都不敢二倍速,我这个人语速比较快啊,所以那个二倍速可能背诵不了倍速干啥对吧,主键字节我就随便指了一个数据嘛,假设嘛对吧,假设。
好了九点半了,我们接着往下讲,有问题的话,我们一会来专门答疑好吧,一会就这么答疑啊,来我接着往下说,这东西第一个句子作业,什么叫句子作业向上,这来还在同学公文一,我们今天晚上讲了,来聊剧索引的事。
什么意思,想了解剧索引,你需要知道一个最基本的概念是什么概念,注意啊,我这有指定的条件,叫音中d b存储引擎中数据在进行插入的时候,数据必须跟某一个索引列绑定在一起,如果表中有主见,那么跟主键绑定。
如果没有主见,那么跟唯一键绑定,如果没有唯一见,那么选择一个六字节roid,进行绑定,这东西它是一个墨守成规的一个前提,刚刚在讲课之前,我给大家看了inno db的存储文件,还记得吧。
在移动db这种存储引擎里面,你看到了你的数据和你的索引,都放在a b d这样的一个文件里面去,里面既有数据又有索引,所以intedv存储引擎在实际的数据插入的时候。
是必须要跟我们的,所以绑定在一起的,那么它就会有一个选择的过程,逐渐有最后的组件,没组件我们就用唯一键,没有唯一性的话,我们就用六字节的roid来进行实际的数据存储,这句话能理解的,根号扣个一能理解吗。
懂吧,所以这就会有一个问题,那到底什么叫句速索引,什么叫非剧组索引呢,记住了,听好了,叫数据,跟索引放在一起的叫做聚簇索引数据跟索引,分开存储的叫做非巨富,所以明白吧,所以把两个东西你要分清楚了。
你要分清楚了,六个字节的raid是什么,就是一个随机字符,六个字节的一个随机字符串被绑定在一起,没在一起,所以这里面与生俱来的会有另外的一个问题,垂直冲地说,所以my sum是非激素,非常正确,记住了。
叫my su中,只有非巨富,所以因为你的数据文件,你的数据文件和你的所有文件是分开存放的,生态释放了好吧,安静说,如果表中没有六字节的呢,他那个64年中y d是隐藏的,你是看不到的。
跟你表有名字字段没关系,它是一个隐藏字段,刘娜说的非常对啊,它是一个隐藏字段,你是看不到的,在我们实际的mysql的数据行里面,其实包含了非常多的隐藏字段,比如说有什么流动性当中啊。
等待着享受db下划线任务,下划线id隐藏字段,还有db下划线,肉下划线p t2 对吧,还有db下划线,t rx下划线id,还有还有delete,想想d它有很多对应的隐藏字段,这些隐藏字段你是看不到的。
你怎么看都看不到,怎么看不到,除非你看源码明白了吗,类似于oracle remember跟zamer好像不太一样,remember是有可能显示查出来的,而mexico它是绝对查不出来的,明白意思吧。
绝对查不出来啊,这些东西,所以下面还有一个问题是什么,刚刚说了max sum是结果飞进作业,那么一扔d b中有没有剧作业,有啊,有句数索引有没有非聚数索引呢,有没有非技术索引,叫移动bb,支持剧组索引。
也支持,叫非约束所,这时候肯定有很多同学就会有问题了,它其实是跟我们下面的二级索引,要产生关联的一个核心点,关键的一个核心点我一样,再给大家个问题来讲,到现在能听懂的同学给老师扣个一,能听懂吗,问题吧。
下面来聊几个问题,什么问题,我们就来解释,首先第一个一个表可以有几个,所以,记号,无限三个可以吧,第二个每一个索引都是一颗b加数,还是所有的索引供应雇雇用,b和b加数,共有啥能力的独立啊。
独立也就是说是一个表中会存在多颗一加数,明白了啊,第三个数据数据就表中数据存储几份,我们都知道叶子烟里面存的是数据行,存几份,记住一份,如果存一份的话,就会存在一个问题,同学们什么问题。
我一个表里面会包含n多个b加数,如果你的数据只存储实际的一份的话,那么其他的b加数的yes di里面存储什么数据,什么数据,所以记住一句话,同学们记住我下面写这句话,数据是只存储一份的。
这是孙处一份好吧,其他的非聚簇索引的叶子节点中存储的是什么,剧组索引的k值叫k值,能理解意思吧,所以,念头gb中也包含了非聚簇,所以嘛能听明白了吗,也包含了非技术索引,它放的是i d值。
这样一样给大家举一个例子吧,比如说看这张图表里面这个表有三个字段,id name age,一共有三个对应的数据列,下次训练之后,我现在id是主键,内部是一颗普通索引,那么d组件的索引建成之后是这样子。
下面啊空间有限,所以a值自动我没写,这是我们对应的这个剧组索引,而name也是一颗b加数的话,name这个里面存的是什么,看到了吗,名字对应下来之后,最底下放的是什么,放的是我们对应的id值。
所以在内部这颗b加树它就是一颗非聚簇索引,而i d这个b加树它就是一棵巨树索引,明白了吗,同学们听明白了吗,来这块听明白,同学给老师扣个一吧,能听懂,啊把这东西啊你要搞清楚了,所以什么叫二级索引呀。
或者说什么叫辅助索引,表示意思是一样的,引导db中的非剧组,所以都可以称之为叫二级,所以或者辅助,明白吧,这是它最基本的一个概念,我希望同学们把这个概念给了解清楚了,就这块的一个基本讲解。
这块的基本讲解啊,来这东西能过的,来给老师扣个一,能够吗,两个概念,二级索引跟回表没关系,回表描述是一个过程,所以描述是一个具体的物理结构,pad是不一样的,一会我来解释回表的事情。
一会儿我来解释回表的事情,20岁一定没有很懂,举举个例子吧,举例子说明啊,文章表里面有id逗号,name,逗号配置逗号,tender,四个列在四个列里面,id是主键,内蒙是普通索引,好那我问一下。
在查询的时候,数据跟谁绑在一块儿,数据跟id绑定在一起对吧,name对应这b加数叶子节点中存储的什么值,开机了是吧,此时内部,就叫做辅助,所以或者二级,所以这个意思听到了吗。
它是用来帮助辅助查询的国家里,所以就这意思明白了吗,好吧,如何来确定哪个索性是二级索引,你非技术索引都是二级索引,就这么简单,没有任何唯一件和组件的表述,是建立的第一个索引吗,没有任何主见。
没有任何文件的话,他会选择六六字节的roid,作为你的技术索引存在,作为你的句子逻辑存在,就是我刚刚说的顺序是优先主键,主键没有唯一键,唯一键没有的话,会生成一个六字节的roy d。
这上面的顺序把顺序要记清楚了好吧,就这一块儿,小梦说优先pk嘛,什么意思,没懂来下面来解释多个链接索引的,不管你有多少个列,非静索引,都是我们对应的辅助索引或者二级索引,明白了吗,不关就多少个练好吧。
但是你的表里面可能出现一种情况,主线可能只有一个,但是唯一一件有多个,如果存在多个唯一键的话,那么这个时候表里面又没有主见,那么你的数据剧组索引,会按照你唯一键指定的顺序来。
比如a b c3 个点都是va键,a在前就选择a b在前,选择b c在前,选择c,唯一四代和c指针吗,要要,没有任何唯一键和主键的表,多个列建索引的,哪个是主线,六字节的rod,明白了吗。
六字节的rod,六字节的roid过目,v4 c指令吗,要要没指定的话,就是i d了,好吧,来下面解释下一个概念叫联合索引,这还有个概念叫符合,所以这是什么意思,很简单好吧,类似于联合主键的意思。
一般情况下我们在设置索引列索引列的时候,只会选择一个列作为索引字段好,但是在某些特殊情况下,需要将多个列共同组成一个索引字段,把称之为叫句哦,称之叫联合,所以就相当于原来是一个列,现在变成了多个列。
仅此而已,仅此而已,好吧,这能听明白吗,这个联合作业,联合主键和联合有啥区别,他俩能在一块比,这俩能在一块比吗,这俩没有什么可比性啊,明白了吗,my time中索引都是辅助索引吗,可以这么理解。
因为它没有句索引,只有非剧索引,所以它都是辅助来进行查询的啊,来你连个作业听明白了吗,听明白了,给老师扣个一,所以你就查找标记吗,是你查找的字段吗,那你的字段来判断吧,是这意思好吧好了。
这是这几个存在的最基本的概念,我觉得你应该了解了吧,好吧,来再往下看,说第四个在进行索引优化的时候。
需要注意什么问题,我刚刚已经展示了非常非常多的索引相关的,一些信息了,你告诉我根据上面学的东西,我们如何来进行索引优化呢,可以说那my sm里面e键存的是什么,存的是地址,存的是地址,看好了。
上面我已经讲了这么多点了,下一个问题是。
系列 6:P85:在进行索引优化时应该注意什么问题? - 马士兵学堂 - BV1RY4y1Q7DL
所以优化的时候,要注意啥,注意什么,同学知道了啊,第一个,所以占用的存储空间需要尽可能索引字段,要尽可能少的占用存储空间,还有吗,在满足业务系统的需求类,尽可能就这还有吗,还有啥,没了,所以在进行。
索引字段,我刚才没提这东西,hope说了就尽可能不要为空,我说的东西啊,呃空这玩意在数据库里面,它是一个非常非常特殊的存在,因为在很多情况下面,空都不等于空,对吧。
空调那叫is not for long呢对吧,但是尽量不要选择为空的字段,听明白意思吧好吧,这个东西啊,还有第四个选择索引的时候,索引,的基数要尽可能的,有人知道什么叫基数吗,你知道什么叫基数吗。
这里面有一个计算公式,什么计算公式,就是说我们在建索引的时候,到底给哪些列来建我们对应的索引,这边有计算公式,记住了,叫dv除以count,大于等于80%,这四段适合创建,所以明白意思吗。
刚刚那个同学恶龙咆哮说,假如给性别加字段,你给性别加索引一点意义都没有,一点意义都没有,dv是什么,不知道dv是啥吗,就这,distinct value,唯一值,唯一值除以count要大于等于80%。
明白了吗,性别这个字段你加索引一点意义都没有,就是要给你视频加作业没意义啊,你加作业干嘛,你性别只有男和女男女,你加缩减之后,你通过作业来查询没有意义啊,你加这玩意儿明白意思吧,这没理啊。
对你的不重复的值要尽可能的多好吧,充值多的话,这个长期的话要比较麻烦,ok那什么,看到了吗,查了也不会怎么样吗,你在另外一个字段查询的时候,查出来都是重复数据吗,那没意义,也不会怎么样,还有啥。
不要给所有的字段都添加索引,并不是索引越多越好,明白了吗,这点是很重要的,很多同学老师,我能不能给表里面的每一个字段都添加了,所以不要这样,你给人表里面的每一个字段都添加索引之后,效率不一定高。
效率不一定高,它会占用大量的存储空间,明白意思吧啊再往下看第六个还有什么,还有吗,尽量避免索引失效,尽量避免索引失效,尽量避免索引失效,那这里面就涉及到一个问题,老师索引失效会有哪些场景。
比如下一个我要聊的话题,什么情况下会导致索引失效,有人能说一下吗,所以那应该是很少修改的,这个是对的,下一个吧,这个我这我之前没准备啊,下一个,尽量选择的索引字段尽量不要频繁,修改,来第一种情况。
所以这种情况你们说的啥来着,查询的时候,左边时候,不要加百分号对吧,还有吗,意思呢all的情况我建议你不要说all的情况,不要说,看到吗,所以是这样的,好,所以字段上不要添加任何的表达式操作,明白吧。
不要加任何表达式操作啊,这是第二个,还有吗,第三个对,所以,字段在使用的时候不要出现类型的影视,也是,转换,看啥,所以,以上不要出现函数计算,说什么组合索引在进行使用的时候,要遵循最主匹配原则。
我还没说这东西啊,匹配原则,可作品原则我还没说,不知道电影是转换啥意思,来给你举个例子啊,等下我给你找个案例啊,找一个案例,我想想在哪放着,国家电营业一堆情况。
知道一下,你找一下这个东西,所以失效,嗯还有啥,你现在睡觉吗,不知道从哪讲,这玩意儿,等我找一下,忘了昨天咱俩讲的,所以失效的情况我这写了一堆啊,宋主要,什么算了,给大家举个例子啊。
就是这个东西是啥意思,什么叫影视转换,比如说我们在进行具体的数据库操作的时候,有一个叫做什么来着算,来看这个方式来演示这个这个这个这个案例啊,来打开我们的数据库,演示一个案例,柚子dem。
大概有点存在多少,这个user你看看表吧,表演单一几个字段,三个字段好吧,123id name和phone,只有且只有这三个字段好吧,当报完了三个字段之后,还有一件事。
我现在给我们的phone字段我添加一个索引,讲完了讲完之后查询语句,你在写的时候,比如说我随便写一个,大家看到这个sql语句吗,我问一下,我现在这种作文字段是什么类型的,什么类型,观察类型啊。
我现在写什么类型,数字是数字类型,你运行之后,你看一下你的执行计划,在执行计划里面k这页里面显示的就是n,如果现在我换一种操作,我把这个东西加上单引号引起来,这有值了吗,你知道吧,这就是我们对应的类型。
如果你的类型发生一种隐式转换的话,它可能会导致我们对应的索引失效,就这意思明白吧,看出来了吗,那这个案例看明白的同学给老师扣个一。
能看懂吗,就就这意思好吧,大家都懂的情况好吧,再往下看,还有一个东西我需要大家说一下,in或者,很多情况下会导致,所以失效,但是要根据实际的情况来进行判断,明白意思吗。
你不要上来就说印会失效或者懊悔失效,这种说法都是不对的,都是不对的,ok直播不是直播,是录播,所以啊把这几种情况给大家说清楚,说清之后,你随便哪个地方能举出一些案例就够了,能举出一些案例。
我记得我之前用过这东西,但是忘了好吧,来再看还有什么,第七个,在使用组合索引的时候,如果中间的某个索引列使用了范围查询,那么会导致后续的索引失效,这东西啊一会儿也是一样,我会给大家举个例子。
来说明这几种对应的一个情况,好吧,这我写了七个,我就差不多够了吧,你面试的时候,请给面试官说这些情况就可以了好了,这几个点能听吗,同学给我扣一,能看懂吗,这这个东西啊我来给大家一会,我来解释几个名词。
解释几个名词的时候,我们把对应的案例啊给大家做一个演示,做个演示好吧好了,这是刚刚上面讲的这些核心的一些知识,讲完核心知识之后,我们再讲几个关键名词吧,把几个关键名词讲完之后,基本上就结束了。
第一个名词刚才提到的这回表,来知道回表是啥意思的,给老师扣一,不知道扣二,你们知道什么叫回表吗,鬼表示这样一个意思啊,给大家解释一下,我们来列举一个场景,什么场景,比如说表里面有id逗号,name逗号。
认识多少,针对四个字段啊,先明确这四个字段,当我定好四个字段之后,我来规定一下,这里面有i d是组件好吧,name是普通,所以我写一个语句叫flat行,from people where name等于。
张三问一下,这条sql语句的查找过程是什么样子的,商用的,先根据,内部的值去name b加数,找到对应的叶子节点吧,我问一下这个叶子节点取得数据是什么数据啊,液在放什么,取出id值吧。
再根据id值去id,b加速攻找到查找全部的结果,这个过程称之为回表,是回表的意义,明白意思吧,那我问的是什么,回表的效率高还是低啊,回转的效率高还是低,怀表的效率比较低好吧,尽可能不要使用。
我尽可能避免回表的产生,明白意思吧,这些东西这是回表,那这个没问题的,扣一这个回答概念啊,他需要来回去回到原来表里面查询,我们对应的一个数据记录,是第一个来聊第二个东西,刚才要是讲的第二个叫索引覆盖。
什么叫索引覆盖啊,表示一模一样的数据一模一样,我把这个语句改一下,改成什么呢,加油id逗号name,大家问一下他的操作构成什么样子的,什么样子,是不是先根据name的值去name的b加数查找结果,能够。
直接获取到id和内容,还需要就不需要去a d的d加数,查找其他的查找数据了,这个过程,叫做索引覆盖,明白了吗,什么叫索引覆盖,也非常简单,就是说索引的叶子节点中,包含了要查询的全部数据啊,叫做索引覆盖。
能听懂吗,这效率高还是低啊,是高还是低高吗,这谁啊推荐使用,所以盖这些东西,看来再往下看下一个,他们叫什么叫最左匹配原则,这是什么东西啊,什么叫最左匹配原则呀,其实他也挺好理解的啊,它主要针对什么。
针对的是组合索引,一样改一下条件吧,id name和逗号位置是组合所有,组合专业就在查询,有时候必须要从左向右匹配这东西啊,就算我们呃去购物网站,你在购物网站里面写写写地址的时候一样,必须要先学省。
再选四,再选缺,缺一不可的,必须按照这样的这样的一个数据来,老师这里面会与生俱来对应几个语句啊,给大家查一下现在的行,from table,where name等于比如问号and edge等于问号。
这是第一个语句,下面还有几条,把它干一下,删掉,删掉,我问一下这四条语句里面哪个会用到组合索引,14134134,还是那句话,你记住,我刚刚说那个标准顺序,必须要从左向右挨个匹配,所以在匹配的时候。
我们先匹配第一个内部age是不是符合这个顺序,所以是没问题的,第二个edge能复合吗,必须要先匹配name再匹配edge,你这里面没有name,所以第二个是不行的,第三个可以吗,可以啊,虽然没有。
但是我能匹配到name也是可以使用的,第四个把name和age顺序换了一下,第四个行不行,第四个节目,这是比较有争议的地方,其实我问一个问题就行了,如果把name和age的顺序来回换一下。
会影响我们最终的查询结果吗,会影响吗,不会的,所以这块会有一个东西,就刚刚说的是优化系,会优化明白吧,会调整好我们对应的一个顺序就完了,这就是我们说的最左匹配原则对吧,除了最左匹配原则之外。
还有下面一个东西,什么原理是什么,没啥原理。
系列 6:P86:什么情况下会导致索引失效? - 马士兵学堂 - BV1RY4y1Q7DL
在比较数据的时候,你要先比较第一个才能比较第二个,只有第一个相同的,我才会比较第二个,可能如果第一个不一样,第二就没必要比较了,就这么简单,来啊下面最后一个我们来讲一个索引,下推液化气后会不会走。
索引是不是优化气不会阻索引,它优化完成之后,会把你这两个条件的顺序换一下,换完之后不就符合内幕和a值了吗,它就会走啊,会走啊,汇总好吧,为什么内部一定要在前,因为你在创建对应的b加数的时候,大家看好了。
我们刚刚给大家展示的,找一下,刚给大家展示这个索引结构的时候,他这个key是不是只有一个值,当你是一个组合索引的时候,它就变成两个直道,比张三和28会放在一起,李四和39会放到一起,所以我在匹配的时候。
它相当于是一个二元组,明白吗,x y2 元组我必须要先比较x才能比较y,如果x不一样,我就连y比较的意义都没有了,y的永远不可能比到,只有x降头的时候,我才可能才可能会比到y就这意思好吧,是这意思啊。
你要最后面一个话题吧,叫三能行吗,三行啊,三可以不要说话吗,国木森可以的,虽然可以啊,虽然另外一只,但是name的符合那个顺序嘛,所以是可以用的,来聊最后一个东西叫索引下推,什么叫索引下推。
其实他也非常好理解啊,非常好理解什么意思,还是当前这样一个情况,我来写一个sl语句吧,flag行from k宝,where name等于根号,an值等于根号,就这样的一个普通字母语句,在没有。
所以下推之前他是怎么处理的呢,处理原则非常非常简,单,是先根据内部这值从存储,引擎中拿到符合条件的数据,然后什么在server中对age进行数据过滤,这没有索性下载之前有了,所以下推之后怎么做的,直接。
根据name和age,从存储引擎中筛选对应的数据返回给server,不需要,做数据过滤,明白意思吧,就这意思,必要的数据获利好吧,这叫回应下推,所以你把这东西想到之后,你再联想一下。
刚刚最上面我给你画了个图,他下推是相对哪了什么的,下推,这是神子下垂是吧,原来在server层,我要对age做的下推挪到了哪,挪到了存储引擎层,明白意思吧,从service层数多少,存储引擎层。
什么叫有了,什么叫没有,在mysql 5。6和5。7之前。
是不包含索引下推这个东西的,是5。6还是5。78,不忘的一个版本的啊,这个版本之后它才具备了索引下推这个功能,当然这个功能是不需要用户开启的,它默认是开启的,有一个属性15万吧。
是那。
叫啥来着,叫。
你一声,我来看啊,有一个东西叫索引下推,这个叫index,肯定是push down,它默认是开启的。
默认是开启的,在5。7之后默认就开启了,所以你不需要管这些东西。
你大概知道,所以下跌是什么意思就可以了,明白意思了吧,这叫算下退,没别的意思,来这些点看学校同学给我扣个一,没看懂吗,没问题吧好吧,当这些东西都没问题之前都都没问题之后,下面我们要说一个东西了。
说啥最后一个问题,刚刚讲了这么多,讲这么多是吧,有有有啥用来告诉我。
所以下载有用吗,所以下载有用吗,它的数据量是一个级别吗,你只匹配内幕,是把所有内幕匹配的数据反而回去了,age还没做数据筛选,你把mate和a这两个东西一起数据筛选,看筛选完数据是不是要少了。
你io量已经少少了吧,好吧,好了聊完这个东西之后,下面我们来聊最后一个东西,这个东西什么东西,所以优化我刚刚讲那么多东西了,讲那么多东西了,我们在回答索引优化问题的时候,我到底应该怎么去回答。
你不要上来之后,你不要上来之后就给面试官说,我通过判断之后发现我们的索引,我们的索引那个我没索引没有失效,所以我加了个索引字段,你这样去描述是没有意义的,你告诉我这个,所以这个优化问题我应该怎么去回答。
没有你所学的知识能回答吗,能回答,大院记住啊,你在回答优化问题的时候,你要给人的感觉是什么,是你真真正正的你做过优化,而不是说我从网上随便看了个帖子,我就能把优化的问题给大家说出来,不是这样的。
你要怎么去判断这件事情,非常简单,来听好了,这样的方式回答在之前,做叉叉项目的时候,我们有一个要数据量非常大哇,千万级别,千万级别好吧,写了一个非常简单的sql语句,就是一个条件,过滤好。
但是查询的效果非常差,花费了十几秒,哇通过分析之后,我发现通过查看执行计划后,也确实用到的索引是吧,而且查询条件非常简单,只有一个,怎么办,只有一个,怎么定义用法,能优化吗,啊怎么做。
利用前面所学的知识组合索引对覆盖话费,剃头说的非常对,现在可以说只有一个经过分析,发现我要查询的字段,字段用四个字段啊,但是这四个字段啊,而且这四个字段包含了查询的某一个查,包含了查询的。
还包含查询条件,因此不考虑减少回表,因此考虑在长安学过程中出现了大量的回表,好吧,此时将所有的查询表字段,和条件是组成了组合,所以好达到了优化效果好,执行完成之后,只需要,花费一秒左右就可以完成查询。
你这么说吗,拆开说绝对录播了,自己我看过对,是录播,我问你是录播吗,一直说录播吗,看到了吗,你能这样说吗,好同学们,你能能不能这样说,才说这能量扣一不能的,扣二能吗,不严谨,那不严谨吗。
我上课临时写的吗,你觉得哪儿不严谨,能不能自己学优化,能不能自己再编一下,能不能带上你自己的业务量,带上你自己的数据量可以吗,可以吧,我觉得没问题吧,嗯1000万数据加索引要dba来。
要dba以来没关系,你后面可以再加一个补充大量数据,添加索引字段信息的时候,可能会出现缩表情况,所以是跟那个那个,所以我提出建议使用什么,mysql提供的在线d d l操作,来完成天下索引的功能。
行不行,可以吗,这有漏洞对吧,给你补上了吧,有什么东西吗,粉丝都不知道这东西啊,在线b b r mysql,5。6版本之后出现一个在线地点啊,你可以给它进行索引的一个添加,没关系的。
这就是具体东西下去自己看明白了吗,这可以了吧对吧。
你黑马扎吗,我只是给到大家一个案例,我我并不是想把这个例子交给你们好吧,因为我既然公开课上讲到这玩意儿了,这玩意就烂大街了,明白吗,很多人都会抄走,很多人都会有这个东西,所以这东西不是你的加分项。
加分在什么地方,是这样的描述方式,你在写的时候一定要突出什么几个点,同学们记清楚了,第一个叫实际场景,你需要进行切换,第二个第21场景,第二个是什么,是问题的情况,第三个是优化的方式和你的思考。
思考的过程好吧,第四个是达到的效果,能懂这意思吗,这是你在回答对应的优化问题的时候,你整体的思路,你要以这样的方式去回答,而不是上来之后不要用三星,再用索引,不要这么去描述,能听到我想教给你的是啥吗。
来听白同学给我扣个一,能不能认懂,所以你把这种方式画出技巧,学会了,套用上你之前项目里面的案例不就完了吗,我不信你们项目里面没有对应的sql优化案例,不可能没有吧,光我现在学生问到我了。
我给你开一个实际的案例好吧,一个学生之前问我的,他实际公司里面的应用场景出现了问题,这数据量消耗比较慢,我给你看一下,太多了好吧,让我们来看你学生问我的,李老师打扰你一下,来看一下干什么事儿。
这个学生他的情况也非常简单,这是对应查询语句,sd什么cell number,cancel,什么什么chinese name,type of,type of product,这不多吧,这一句能看懂吗。
能看懂吧,我觉得这一句已经非常简单了,执行完成之后,他花费的时间是多少,0。104秒,我问一下这个0。104秒是快还是慢,快还是慢,大哥们负点责任,你们在说快再说慢的时候,能不能问一嘴数据量。
他过亿的数据量还还卖吗,别上来就慢跑快,你问一下数据量吗。
对不对,所以下次问了一个问题,他说打扰你一下,他说这个表总共才35万,数据category id等于6980,有20多万条好看的id,也要有索引字段了,好吧,我发完之后,他给我发了什么。
发现它对应的执行计划,杜老师,你看这个执行计划这样的,这个字段明显用到了索引,不是没用。
索引用到了听到索引了,但是效率依然很低,不太能满足我们的业务需要。
怎么办,我看完他之后,我说我可以ok,你可以考虑关闭一个属性叫index merge,我我刚开始怀疑啊,他可能触发了一些索引合并,所以导致了他出现了一些问题好吧,做完之后他说老师运行完了还是100多秒。
没有任何变化,0。106反而还慢了一点,我觉得这个那这东西肯定不行了对吧,再给它进行优化,我说这个有组合索引吗,可是没有组合索引,我说你串一个组合索引试试好吧,我串完之后他说还不行。
我说把排序再去掉试试看是不是排序的问题,是做了一堆,做了一堆检测完啊,都不行,还一样,这东西要慢慢去调整的,这次是0。1118秒好吧,再优化再优化,我说你加这个东西,再加上排序,加完之后。
这是它对应的结果,大家看看效果,谁叫我,我们出一下吧,0。106÷0。006,快了17倍。
看明白了吗,就是快这么多,自己都自己都惊讶了,明白了吗,这是对应的数据吗,所以你要想明白说我要在哪些地方去进行优化,我要去调整哪些地方,你别两眼一抹黑,竞猜我最怕什么,你知道吗。
很多b i g同学找到我说,梁老师,你帮我看一下这个sl语怎么优化,你发给我,我也懵逼,真懵逼,我根本不知道怎么做,你想你发给我一个那么复杂的sql语句,然后你告诉我说老师你帮我优化一下。
我咋能给你优化了,我是个人,我又不是个神,能懂我意思吗,这经常说的一个一个很重要的一个问题,好吧,等下我给你找一下午一个同学,就今天下午一个学生刚给我发的,呃找一下,就这个。
我们等会儿等会儿我们看看这个sql语句啊,我跟你说,看完这个剧,我自己心态都崩了,嗯还没翻到,等一下,看这个,这是他给我发了一个sql语句,从select开始往下走走走走走,你去看这个sql语句。
你去看,这最后一句。
来你告诉我这样的语句,你告诉我,你让我去怎么优化,我我我我打优化,你告诉我怎么做,一条就一条没完,你告诉我能优化吗,我优化不了,我是个人,我不是个神,好不好,所以你们要搞清楚这个东西明白了。
所以不同的案例你要去分析他,说到底哪出现了问题,应该怎么去做,这些东西应该以什么方式进行优化,这才是最关键和最核心的点,明白了吗,噗都打结了,不是打结了,这个东西展开啊,微信里面可能看的比较长。
微信里面看的比较长,打开之后已经大概几十行几百行,但是依然很很麻烦啊,是不是,不是故意难为我,我在公司里面见过最长的一个,一个sql 145500行。
系列 6:P87:如果通过索引知识来进行优化? - 马士兵学堂 - BV1RY4y1Q7DL
下次注意句,这很正常,所以你们需要说的是什么,我需要给你讲实啊,不是让你们去说这个思路语句长度的问题,而是说你们在进行优化的时候,不要2。18,黑,明白吗,最害怕的是这玩意儿啊,你要干嘛。
哪怕sql语句,sql语句再复杂,不管它多么复杂都没关系,你要学会去做拆分,你要自由就去拆分,你要一层一层的去迭代,一层一层的去搞这东西,把它理解错了,这才是最关键,最核心的,他是生病,铅笔干啥。
这很正常,但好多表在关里面就这死杂一点,复杂点也正常吧,明白意思吧,所以掌握合理的方式方法,这一点很重要啊,包括你们在提到这些优化问题的时候,再好好去思考,一定要按照我说的这个思路你去进行处理。
如果你按照这样的思路去解决的话,真的很麻烦,真的很麻烦,不要上来之后有老师你帮我调一下优,我咋调都调不了,好吧行了,这东西啊,咱们大概就聊这么多吧好吧,来这今天晚上有收获的同学给老师扣个一了,好不好。
讲了两个小时啊,我觉得我讲的已经够多了好吧,老师数据量过亿,增加索引会非常慢,有什么好的方式了,没办法,就是用在线d d l的方式来加索引,这个没别的招都能夸张,慢就慢,这个没没办法,我们打扰一下。
现在几位是不是应该分表了,举个例子,10万百万就比较合适,低于多少条加索引访问一下写系统,我觉得是这样哈,帮助听好你的问题,我们一般情况下数据量过千万级的时候,就要进行分部分表了,但这只是一个预估量。
它没有明显的一个数据统计,你过千万,你还要判断一件事,除了过千万这个级别之外,你还要判断什么东西,你要判断一个点,您每一行记录占用的空间是多大,每一行记录你一个一行业里面。
十个字段和50个字段和三个字段,效果一定是不一样的,所以不一定是说过千万,我就要重复分表,这东西是干什么,是根据你实际的需求来判定,当你发现你的表数据变多之后,你查询不管怎么优化都优化不了了。
这个时候可以考虑添加我们对应的啊,可以进入我们的错误分表,但不是说我一旦过千万之后,就一定要分出去秒,这也没什么说的,没什么说的好吧,如果my mysql中某个字,但是汉字的话。
在汉字键索引该b加数是汉字的话,怎么保持有序,奥斯干嘛吗,字典序吗,英文名字典序嘛,数字就是数值嘛,汉字的话你要干嘛嘛,但是建议不要用汉字,不要用汉字,汉字的话这个太麻烦了,好吧好吧行了,这东西啊。
咱们大概就聊这么多吧,这只是mysql里面的呃,一丢丢或者一奶奶,刚刚也给大家提到了相关的一些优化的问题啊,给大家看一个文档,就是之前我在讲这个mysql优化课的时候,大家看一下,这叫msl调优。
讲mysql调优的时候,给大家讲到的一些细节上的一些点,大家看一下,你调料里面包含的东西非常多,你不要上来之后就想着说我要加索引,所以优化的时候你可以分几个维度和几个细节。
比如说你关于mysql性能的一个监控是什么样子的,对吧,你对应mysql的一些呃spammer表结构是什么样子的,你的索引要怎么进行优化,包括你对应的sql语句要怎么调整,包括你的参数要怎么去优优化。
怎么去调整,包括你是不是要加分工那个分布式的数据库。
这东西都要合理判断好吧,沈阳马天志说看不到,我说话吗,对看不到的,因为是录播,所以看不到,开玩笑,画风有什么软件啊,我刚说了吗,分叶云笔记,枫叶云笔记,是直播是直播,哎呀是直播啊,那你不理我。
我没看到你发的消息啊,你发啥了,没看到吗,梁老师结束的时候,可以谈一下,不同的存储引擎对于事物的支持区别吗,可以另外给压缩了,来说一下它们的区别呃,我之前讲过这东西,我现在在哪儿讲,我找一下。
我记得之前讲过这玩意儿好像,四个,我,找一下,所以,太多了个旺,看这图吧,这是之前画的一张图啊,就是关于这个组合式九的msl,amex up和windodb的呃,首先第一个综艺类型masm面。
只有非技术索引性层地狱里面有剧组索引,也有非剧索引,第二个事物呃,my sm是不支持事物的,印度db是支持事务的,第二个第三个表所my sum支持表,所应当db也支持表锁行锁,my sum不支持。
但应当db支持外界maximism,不支持移动db支持全员索引masm支持,然后应用db五点之后支持操作,大量查询的时候用我们的my su,然后增删改查的时候就移动db,但这东西啊。
坦白说一般情况下移动db用的更多一点,其他用的并不是特别多,好你大概了解一下就够了,ok所东西啊,咱们明天讲吧,明天我讲一下事物相关的点,好,检查事物一些特性啊,检查事物特性的一些实现原理。
讲一下mv c c,咱们再到时再聊好吧,老师有主从知识吗,有主从的话,我讲过主从复制,然后讲过读写分离仪,讲过分部分表都都讲过,包括像mt这样东西我也讲过,好吧,就是你学生问你的那个,有学生问我。
那个为啥那个索引添加之后排序变坏了,就减少了回表嘛,就减少了回表,就是减少回表,我那个东西我没公开课那个那个那个不是主从,这东西我公开课没讲过啊,都是在vip里面讲的,公开课没讲过,来看一下吧。
嗯这里有一定的文档给大家看一下,就是比如说主动复制的原理,我之前写的什么主动复制原理是啥,怎么去复制的步骤是啥,形式有哪些,然后主动复制延时应该怎么去做,这是应该都提到过,都讲过这个东西好吧。
包括它的一些安装配置,你要怎么去配,搭建的时候要怎么去搭建详细的步骤,这些东西都有好吧,他那个也是减少了回表的产生,就这么干的是吧,然后包括像my cashing sphere,我都给讲过,没讲过。
ok笔记能发下吗,笔记不发了发吗,写这种东西要发吗,再说吧好吧,都发下来吧,那么多markdown想多了好吧,就发ok好了,今天的这个具体干货,咱们就聊这么多吧好吧,下面呢聊点更好玩的东西,聊聊什么啊。
不发怎么学,听我讲这些东西你就慢慢消化吧。
不发你那个那个那些段都发了,跟vip同学太太不公平了好吧,下面聊点好玩的东西吧,聊点好玩的啥啊,刚刚给大家讲了mico相关的东西,我刚刚给大家看了一下msl调的一个文档啊。
呃下面给大家说一些东西,就是你在学技术的时候,或者你在学习的时候到底要怎么去学习,接下广告,我不不打广告,我们就聊会儿天,我们不麦克,今天不卖课,不给大家打广告,里面点好玩的东西啊,就是聊到一个问题。
你们觉得我今天讲完这个课之后,你们都觉得收获比较大,我能学到很多东西,这样我想给大家说一件事是什么,希望大家在以后学习的时候,能有一个很重要的东西,叫什么叫方向性的东西,这东西我觉得是比较重要的。
什么意思啊,有很多同学听完我这个讲东西之后,你觉得我把索引讲完了吗,或者你觉得我把索引讲完整了吗,其实没有啊,这所有里面包含的东西还有很多,这只是其中的一些细节,或者一些比较重要的部分。
和面试中问的比较多的东西,我优先拿出来给你讲,但其实索里面包含的东西还很多,大家以后在学习的时候啊,你们既然晚上来听课了,意味着你们平常的时候,自己可能也会学点别的东西,包,或者以后琢磨点东西对吧。
一定要一直在不断的学习,那么我想说的是什么,你们在学习的时候一定要有一个方向,同时一定要注意一件事,什么事儿叫体系化学习,体系化学习这件事情是非常非常重要,什么叫体系化学习嗯,很多同学出去面试的时候。
应该收到过一些评价,比如说知识碎片化,比如知识不成体系,一定收到过这样的一些评价,这些评价都反映了你在学习技术的时候,你自己存在的一些短板,所以我希望同学们在学习的时候,一定要有一个体系化学习。
我就是不要说我今天学一点,每天学一点或者学一点,但学的东西都不一样,这是最可怕的一件事情,包括我们的vip也经常问我一个问题的老师,我在学技术的时候,我是多个技术并行着学,还是说我学完某一个点之后。
我再去学另外一个点,你们觉得哪个好一点,你们觉得病情好还是单独学一个好一发,一般都是看到什么学什么,告诉大家我个人的建议啊,大家学习的时候一个一个来,你千万不要同一时刻看三门新技术,或者看n门新技术。
或者看一门技术,千万不要这样,这边一定要一个一个来,因为11111堆东西堆到你那儿之后,你很麻烦,或者你看起来会很容易忘,或者说体育效果是非常非常差的,学习就是把某一个体系,某个体系学完了还有一个点。
还有一点也很重要,一定会用到自己的一些知识盲区,老师讲课的时候一定会提到一些点,当你提到了一些点之后,你会发现一件事,什么事,这东西我不会,那东西不会那么很多同学会干嘛呢,会从这个点里面离开。
把我要搞明白的东西,我搞明白之后,我再接着来学习,有多少人这么干的,有吗,就比如我学mysql,昨天讲了一个o l a p,我不知道是啥意思好了,我去学o l a p,我把o l p搞明白之后。
我再回过头来学mysql,这种方式,也是大家非常非常要就一定要摒弃掉的,我刚才有好的方式是什么,你在学习技术的时候,学习技术的时候,先去过一遍整体的知识的总体概括,概括完了之后,当你不会的点。
拿一个本或拿一个文档,在线文档把它给记录下来,你把它记录下来之后,接着往下学,等你有时间有一些零碎的时间,额外的时间之后再去补那些你不会的点,千万不要让自己跑偏了,也有可能有很多学生是学生是这样学习的。
他沿着一条主线去学习学学的翻译,有东西不会了好了,我从中间分一条叉出来对吧,从这分量差出来,然后又有同学说老师这个东西我也不会好吧,又分量差出来又被拿出来,有些同学还比较好,他能回归到主线上面去。
但有很多同学你是回归不到主线的,你学学学pp了,明白吗,你学篇之后就变得很麻烦,你懂我意思吧,所以这些东西才是你要摒弃一些点,这都是学习方法上面的一些小技巧,然后除了这个东西之外,约等于1米8。
说有详细的路线分享吗,呃想要路线,一会我可以给你,但是我在讲路线之前啊,我还想再说明一个东西,或者再说明一件事,你们有人对学习路线有疑惑吗,老师我现在想学学要学什么东西,有疑惑就要扣101或者扣二。
有疑惑吗,都有是吧,当你在有疑惑之前,或者说当你在要路线之前,出现之前,我需要你们先做一件事情,什么事情,这东西,叫定位,你们知道很多定位吗,什么叫定位啊,谁能给我解释一下,目标菜头师,目标是全站。
想搞全站同学,我建议你换一个换换换一个目标好吧,先生东西叫定位,什么叫定位啊,现在啊这个技术太太太多了,明白吗,就是你要学的话,你根本学不过,你根本学不过来,这学起来是非常非常吃力,而且他学习的时候。
他不一定能收到对应好的效果,所以我非常不建议说你真的说把所有剧都学了,但是你一定要有一个定位,定位什么意思,自己处于哪一个水平,之前我有一个vip学生报名了,报名之后让我做规划,规划的时候呢。
说老师我现在年薪14k,年轻时不是月薪14k,我想出明年冲击年薪50万,你觉得可能吗,挺好啊,现在月薪14k,明年冲击年薪50万,你觉得可能吗,太难了太难了,真的太难了,好吧,记住一句话。
叫饭要一口一口吃,路要一步一步走,技术要一个一个学,所以我为什么说你要定位第一任老师,那我现在到底处于初级,中级高级到底属于哪个哪个阶段,我没法去判断啊,很简单,现在国内或者说现在的市场。
市场上面没有一个明确的标准,说你掌握了什么技术,你就是一个初级的掌握了什么技术啊,就是高级的掌握什么技术,就是中级的没有障碍,拼标准,但是有一个标准是存在的,什么东西叫职级,你们知道吗。
当你们接到大考之后,一般情况下是都要有直接评级的哇,最简单的题节举例子,比如说阿里的我们从p5 到p8 ,对不对,这就是最基本的一个直接像你上网搜,你是能看到很多,对于不同职级的一些技术要求的。
进行更更更改的,当你掌握好这些东西之后,你可以对号入座,你自己现在大于位于某一个水平,同学们来方便同学,你可以给我发一下,你现在的工作年限加你的薪水,你能方便发一下吗,我觉得今天晚上大部分来听课的同学。
你们大部分人的就是薪水等级,或者你们大部分职级应该处于一个中级往上,稍微多那么一点点的一个阶段,就可能很少有那种高级这样,一个一个一个一个一个一个水平的学生,因为接下来我讲的东西其实并不是特别难。
它其实属于是一些基础的必备的常用知识,9年16x14,在合肥3年15 6年10万和6。5k实习,刚毕业10k哇,这80k合肥知道吗,是大家发现了,你们其实大部分人其实应该处于的是什么。
是p5 这个级级别什么意思,我能去做一些独立的开发了,我对我们基本的一些框架,比如说s s m对吧,比如说spring boot,比如说spring cod这些基本的应用我是没问题的啊。
基本应用是没问题的,那其实你当你了解完这些东西之后,下一步你就要考虑到我老师我要掌握p6 ,或者说我要达到p6 这个级别,如果你拿到p6 级别,那p6 我应该具备什么样的能力,或者我应该学什么样的技术。
当你聊到p6 这块之后,下一步才是聊什么,聊路线的事情,明白吗,所以不要把这个前后的顺序给颠倒了,很多同学就是因为把前后的顺序颠倒之后,导致你学起来一直处于一个迷茫的阶段,迷茫阶段哦,比较迷茫。
就一定是先搞清楚你自己的定位,就是我做事情一直是这样的,第一步先有一个定位或分析,分析完之后,第二步数据对应的目标,网站的目标是小目标,不是大目标,有老师,我要年薪百万,老师我要领取白富美,别扯淡。
我现在45k,下一份我就要20k,我就25k,这是比较现实的,一上来就我家构师,我年年纪大了,你舍不得我,财富恶龙咆哮,目标28岁,财富自由,这个梦做的有点大啊,并不是达不到好吧,但是比较难。
所以先输入一个小目标,比如先赚他一个亿,是这意思,现有目标,有了目标之后,下一步干什么事,变成这叫制定计划了吗,对吧,当计划完成之后,下一步才是什么东西,就像一件事就落实,张老师,当然这里面最关键。
什么叫定下一个目标,你还没干呢,就定下一个目标,等这东西实现之后实现了,然后再回过头来搞搞定位,搞目标是这样逻辑,你还没干呢,你就跟下一目标干嘛,一点意义都没有,听明白意思吗,你们以后在学习也好。
在干嘛也好,一定要遵循这样的一个路线,这东西我觉得是心理有效的啊,当然这里面最关键是什么,是这个步骤目标,你的目标不要太远大,不要太红的,这辈子都实现不了,不要带这个东西没意义没意义啊,最关键的是什么。
你要树立一个你能好吧,经过一段时间努力之后,你能够得着的一个目标,而不是一个痴人说梦的目标哇,这才是最重要,最最关键的是年龄不是问题吧,年龄又会有问题,但是你要结合你自己的情况。
在最短时间之内达到你想要的东西就完事了,就这么简单,所以把这个东西你要想明白了,不要去抱怨卷这件事情啊,卷是常态,明白吗,你是改变不了卷这件事情的,所以你能做的事情只有一件事,你去改变你自己。
而不是改变卷这个现现状,卷这个行业动态改变不了,明白了吗,你要改变的是你自己,所以当你把这套东西搞清楚之后好了,我们再来聊路线的事情,比如说这个计划的事情,比如老师那p6 应该学什么东西来。
有人好奇p6 要学什么吗,好奇给老师扣个一,有没有好奇,地址不是说年龄大了怎么办,好了,一会儿我们留出点时间,你们把你们的个人情况告诉我,咱们一会简单聊一下你们个人的规划,我先告诉大家路线是什么样子。
路线什么样子好吧,p6 年薪多少,p6 的年薪大概是40万~60万啊,当然前两天我听曹老师说,阿里出了一个p6 的顶薪,大概是90万,p6 的底薪90万,但这个很难了很难了好吧。
它不是一个短期内能实现的目标哦,所以你需要是什么,比如说这个地方p6 他看中的是什么,p心他看中的是什么,你要做到心里有数明白吗,p6 需要是啥呀,其实非常简单,给大家看一下。
这里面其实就对应路线注意了,p6 它针对的是什么叫操作与落地,明白吗,什么叫操作落地,这个操作流落地里面包含了非常多的东西,我们一块合一下,只能把你们吓到了,好吧,这是hero里面。
p6 里面要包含的相关的核心竞争点,和核心知识点,好吧,比如说现在你要想达到p6 的话,你要有一些自己的前置知识,什么叫全日知识,比如s m spring boot,我能做一些独立的开发对吧。
了解一些新特性什么之类的东西是前置知识,我觉得基本上你做开发了都要具备这样的能力,那再往下看,你还要掌握什么,掌握一些底层技术,比如说操作系统的,比如说计算机组成原理的,比如说网络的,比如说i o的。
比如说linux的,比如运维的以及数据结构和算法的东西,这都是你要掌握的必备的一些底层的技术,现在面试他就问这些,其实不单单是p6 ,你在面临一些上规模的公司的这些开发的时候。
中高级职位的时候基本上都会涉及到这些东西,好吧,再比如说并发编程,你要了解操作系统的并发知识队列的东西,内存模型的东西,线程池的并发集合的c s s y local的j u c的,gm i h的。
你都掌握,是华沙等,说掌握的话,要掌掌握到什么样的一个程度,你要能把这套东西形成自己的一套知识图谱,或者说知识体系,不知识体系什么意思,我一样可以给大家看一个东西,这是我们之前vip他自己做的一个笔记。
他在学jvm的时候,他做的一套东西,我给你看一下,你是能描述出来,当你学完一个东西之后,你如果能把笔记做成这样就ok了,在我的评估范围内,我觉得就ok了,在这个学生他学完jvm之后,他自己画的一套笔记。
我做了一个自己的j a m思维导图,如果你能做成这样子,我觉得你就学到位了,就这么简单,还是那句话,你要掌握是什么,同学们永远记住这两个字,叫体系,能懂吗,不是某一个点,不是问到垃圾回收器的。
我知道是个啥,那能不能把那些同学更好,知道是啥,不是这些东西,你要对各个细节你都要考明白,我可以给你放大看,每个地方都是他做的一些详细的东西,看了吗,做的很清楚啊,参数也好,调整也好。
什么东西啊都做的非常完善,非常完整,这才是你应该掌握的哇,你要能形成这样一套东西出来,所以就说当面试官问到你,不管问到你什么技术的时候,脑海里面啪能打开一张图,同年包含了非常多的东西。
他只要问到三观点了,你能侃侃而谈,这才是最主要的好吧,那现在应该很牛吧,确实很厉害确实很厉害哦,所以这才是你们需要学习的东西对吧,这是并发编程这一块,除了之外,你要掌握一些通信框架的一些东西。
比如说reaper里面通信double对吧,r p c的rust thrust和net这些东西都要掌握,用中间件也要掌握,rock mq卡不卡对吧,都是必备的基础,包括像中间件的应用mem catch。
还有这个redis对吧,包括你要掌握一些软件设计的,一些基础的理论知识,是设计模式,软件工程了对吧,敏捷开发了对吧,一些文档的案例编写的都有,包括你们的分布式架构实践,分布式架构时间。
不单单里面包含了什么分布式事务,分布式锁,分布式id了,不单单包含这些东西,还包含了一系列上分布式密度,分布式绘画,分布式任务,分布式权限控制,分布式预警系统,分布式链链追踪等等东西。
都是你要进行掌握的把,包括你要掌握到微服务对吧,注册发现了网关,路由了服务调用了负载,集成了nfx阿里巴巴的多少物对吧,以及性能调优的cfm调优mysql调用,他们看调用,但这个调用对吧。
海量数据存储的对吧,e的培根house messl news,太dd的,对不对,包括我们搜索e的,对不对,包括像海量数据处理的一些东西,flink还有很多东西,包括像运维的,你要了解一点啊。
di要了解一点,然后测试的你肯定要稍微了解一点对吧,service nt东西了解一下,所以这些东西都是你要进行储备的,明白意思吧,你说如果你想达到p6 这样的一个,技术实力的话。
那么这些核心点就是你要处理的东西,学校做的同学给老师扣个一东西多吗,那你们觉得多多多吧,很多吧,这些东西你都需要学习吗,你需要把所有的东西都一口气学完吗,需要不需要,我告诉大家。
如果谁想着我要一口气把这些东西学完,我觉得你肤浅,为什么技术这东西它是没有边界的,明白吗,你今天学完一个东西,明天可能出一些新的东西,你永远学不完,那你要学的是什么东西,学的是啥东西。
掌握你现在必备的基础,那么你可能会疑惑,老师我现在必备的是啥,这里面有你一点都不会的吗,有没有你现在一点都不会了,你能不能抓紧时间学,能不能从这些模块里面挑一些东西拿出来,优先去学习,能不能。
这是没问题的对吧,你能不能给自己规定一个时间轴,就我刚刚说的,我这一生的目标或这一个月的目标,我要把什么,我要把并发编程搞定,下一个目标,我要把中间键搞定,下一下这个目标,我要把什么东西搞定。
能不能做这样的东西,不怕你不干好吧,就怕你什么,就怕你们瞎干,盲目的干明白吗,所以当你这个东西给到你之后,你能不能有明显的一个路线或大纲,在当你有这样路线之后,你一块一块学不行吗,好吧,虽然说可以。
但是不知道选哪些,不知道选哪些,也非常简单,也非常简单,怎么做,我告诉你第一路线给到你了,你从这个路线里面诶,我问一下,有人想要这个路线吗,想给老师扣个一,有人想要的,谁如果想要的去找咱们的班主老师。
找他们去领取扫地的二维码和扫码器进行领取,能明白这意思吧,上面进行领取,如果你之前加过咱们任何一个咨询老师,找他领取,也是ok的,也是ok的,明白意思吗,好吧,我要说的是什么,当你有这东西之后。
你可以自己从里面选择一些你不会的点,但这是一个方式,除了这样的方式之外,还有什么方式,我再解释一下,还可以干一件事,你找一个领路人,找一个你的师哥师姐,找一下你的一个领导,让他来根据你个人的技术实力。
帮你从里面能不能提取出一些关键的点,你们这样的人,如果这样的人也没有的话,那我告诉你,你就需要报名马士兵教育的课,什么意思,你不知道没关系,老师知道我们会告诉你一步步你要怎么做,懂我意思吗。
啊拿到了和人最差了好多差就对了,人不怕自己说我现在混的差,而最怕什么,最怕不知不自知,明白吗,就我不知道学什么,所以你要掌握是什么东西,把这些关键的核心点,你要知道我哪儿缺乏了。
我要把什么技术给弥补起来,这才是最主要和最核心的关键点,听明白了吗,所以如果需要的话,整体设计领取好,详细看一下东西,我说的东西很多,但不需要你,你你每个挨个都选一下,有老师可以帮你。
慢慢的捋出一条适合你自己的独特的路线,而且每个人的目标是不一样的,所以你每个人需要储备的技术,也不是也是不一样的,如果你真的把这些点都学会了,在p6 级别里面,你真的可以拿到顶薪,明白了吗。
顶薪难度最高,这个东西完全不夸张好,这才是你要储备的,这只是p6 这个职级,这个级别你需要储备的,有人想看pc吗,想看pc的,给老师扣个一,想看吗,就pc我要掌握什么样的技术实力。
这是p6 的p6 强调的是什么叫操作与落地,pc小调,什么叫原理与设计,这里面我们依然包含了一系列的东西,好吧先合一下好吧,然后什么第一个叫分布式设计的理论基础。
这里面包含了一些像c a p的puzzles了,rap了啊,该s i p到这样的一些协议,第二个你要掌握一些核心的算法,分别是架构相关算法和机器学习算法,第三个你要掌握一些框架的原理,什么血压桶呢。
my best is对吧,他们看到这个cd m cute net hosports e l k,你都需要掌握这些东西啊,包括有一个高性能架构设计,什么叫高性能架构设计,比如说分流设计怎么做。
服务并行并发怎么做,缓存设计怎么做,存储设计怎么做,可靠性设计怎么做,并用保护设计怎么做,多位了解,再比如说下面还有一个案例驱动设计,我们这里面提供了一堆的项目设计的课程,比如说每秒数是每秒数10万。
超高并发通用设计专题,有一堆的案例告诉你怎么去设计好吧,应该有什么技术键技术站进行相关的一个搭建,比如说有n个九全链路,高可用通用设计专题对吧,有云集百万年薪好吧,案例驱动式架构设计专题对吧。
有我们的一级流量,多级缓存的架构设计专题,这里面我们更多承受,就不单单是那些比你基础的技术实力了,或基础的一些应用了,更多强调是什么,就是我们整体的架构设计能力了啊,这才是你能拿到pc这个级别。
最最最重要和最最最最核心的关键点,明白意思吗,除此之外,这只是p7 的,这边还给你搭配了一堆的项目的课程对吧,有一些用户中心的,有一些架构设计的,比如说我们有一堆项目课。
有一些网多人在线网游服务器的对吧,东方商城的有没有飞机出行的,有推推荐的,有刘诗云平台的对吧,这都是你要讲的相关的核心点,讲数据库连接池了吗,讲了数据连这最最基础的内容嘛,肯定要讲了。
包括有人说老师我现在技术学完了,我需要准备面试怎么办。
没关系。
系列 6:P88:事务的四个特点是什么?他们的实现原理是什么? - 马士兵学堂 - BV1RY4y1Q7DL
来先聊第一个问题,mysql事务,mysql的事物它有几个特点,结合点,谁能告诉我,四个吧,我觉得所有人都能说出来,叫a c i d,对不对,它们分别对应过来的特性是什么特性,第一个叫做原子性对吧。
第二个把这个字调大一点,第二个叫做一致性,第三个叫做隔离性,第四个叫做持久性,这几个东西啊,我觉得大部分同学你只要在接触数据库的时候,都会学习这几个点,但是这个东西不是我之前想讲的重心。
我想讲的重心是什么,这四个特点,它们分别是用什么样的方式来进行实现的,也就是说实现方式是什么,好吧,一定要做到什么叫知其然还要知其所以然,这件事很重要,什么叫实现方式,也就是说我们的实现原理是什么呢。
他通过想要的方式来进行保证的好吧,那先说第一个吧,原子性啥叫原子性来着,什么叫原则性,就要么全部成功,要么全部失败,是不是这意思好吧,那我怎么保证它啊,其实成功的话非常简单,我数据直接更新成功就可以了。
如果失败的话,我是需要进行回滚的,那我怎么样能够把数据给回滚回去呢,这里面其实涉及到一个问题,什么问题,同一个事物里面可能会包含12345,n多条的sql语句,这n多条sql语句里面。
前三条我可能已经执行成功了,但第四条和第五条执行失败了,一旦失败之后,我前三条执行成功的sql语句,也要回滚到之前的历史版本里面,那我问一下,如果让你自己来实现这个东西,你会怎么实现。
就你自己会怎么实现,是吗,其实你可以做一些思考吗,我只要能做一件事就可以了,我保留着我之前的数据的历史状态,如果我没有提交,我的历史状态依然保持着,当我需要回滚的时候。
我是不是可以把我历史数据重新拿回来,回放进去不就完了吗,是不是这意思好吧,所以这里面是什么样的一个方式,注意了,我先说它底层的实现,基本原则性是通过什么来实现呢。
是通过一个东西叫undo log来进行实现的,来知道undo log的扣一,不知道undo log的扣二,好了,有很多同学不清楚这玩意儿,不清楚这玩意的话,我们来说明一下mysql里面的日志。
专门聊一下这个日志系统,你们在日常开发中啊,其实日志用的也是非常非常多的,在mexico这个图里面,或者msl这个竞争里面,它也包含了非常多的日志,比如说我们比较熟练的日志有哪些啊。
第一个比如说blog,你们是知道的对吧,这个用的是最多的对吧,除了blog之外,第二个刚刚提到的read on the log,除了on blog之外,还有什么,还有redo log对吧。
以及还有很多同学说老师还有这个东西叫error log,错误日志吗对吧,还有什么,slow log慢日志吗,对吧,还有什么,relay vlog r e l a y logo,有人在这里面。
它其实包含了屏幕不动了吗,hello,hello,屏幕不动吗,能看屏幕吗,应该是应该是用浏览器的同学卡了,你们把那个浏览器刷新一下,好不好,把浏览器刷新一下,刷新一下,你在这个地方我写了一堆的日志。
一堆的日志,这件事里面有些用的比较多,有些用的比较少,挨个给大家解释,第一个vlog,它叫什么呢,叫做中继日志,中介就是这个东西啊,是在主从复制的时候用到的,暂时你可以先不管它,或者先不了解他。
在主从复制或主从同步的时候,会用到这玩意儿是吧,这个叫slog,叫慢日志吧,也就是说你在你的数据库里面,经常会开启慢查询,当一个sql语句执行时间,超过某一个限定的范围的时候。
会在我的slog里面记录条日志,我可以根据这个日志来判断一下哪条思路,语句执行的比较慢,那么来进行相关的一个调整对吧,这个这个叫erroid,什么意思,错误日志吗,在整个mysql执行过程中。
如果某一个呃操作出错了,会进入到所有errolog里面去,就这几个,这个我觉得还是比较容易或者比较好理解的啊,上面这三个我需要重点给大家解释一下,这是我们今天要聊的比较多的东西,为啥删掉不删掉就留着嘛。
无所谓了,写写下错误日志,慢日志好吧,留着留着留着,你们说留着就留着,什么时候出现错误日志,你程序出错的时候就出现嘛,对吧,这有啥,下面我要聊出去聊这三个东西啊,这三个东西上面这三个给我们今天讲的课程。
关联度会比较高一点,第一个blog blog叫什么叫二进制日志文件好吧,他在mysql里面默认是不开启的,但是我建议同学们不管是你自己练习也好。
还是生产环境里面也好,最好把冰冻保存开启,因为它能够帮助我们进行数据同步以及恢复,这事很重要,也就是说当你有了blog之后,哪怕你的数据丢失掉了,我也can you。
可以根据我们的blog把数据给恢复回来,好吧,下一个叫undo log,什么叫undo log,它的名称叫做回滚日志,回滚日志是吧,还有一个relog,它叫什么叫前滚日志,这当做自己取的名字啊。
前滚这是一个回滚,一个前滚,他俩其实相相对应的,相对应的,那我想说的是什么,一会儿我会重点解释一下undo log和redo log,他们两个的实现机制是什么,但是我这要强调一件什么事。
同学们一定要注意了,我们的blog,昨天我给大家讲解过mysql相关的一些架构体系了,那这样我要说明的是一件什么事,情,注意blog它归属的层次是谁,是massive的server层。
而我们的undo log和我们的resulg,它并不是存储在masl server层里面的,它是属于哪个呢,它是属于in no db这种存储引擎里面去的,这是它们之间的区别。
一定要知道它在哪一个层次里面去生效,所以我们昨天今天我们讲事物吗,mason它是不支持事务的,但是inno db是支持事务的,所以这两个东西重点的时候就聊inno db相关的,合适点,能听明白吗。
来我现在讲的这些东西能理解的,给老师扣一,能理解吗,好了这些都能理解的好,我来回答出来,那它到底是怎么实现的呢,其实非常简单,我刚才已经说过了,如果我们想进行回滚的话。
我如果保留了我之前某一行记录的某一个,历史状态或历史版本的话,在我没有提交,或者说我失败之后,能不能恢复到我上一个历史版本的状态,能还是不能能不能,就我考的历史版本吗,有个历史版本之后好。
我回复回去不就完事了吗,就相当于你们在操作系统里面,或者你们在做一些呃备份的时候,是不是有一个时间,是不是有一个the time step的东西,你是不是不是tesp有个叫快到的东西。
是不是可以恢复到某一个历史时间状态,把数据恢复回去,特别是在虚拟机的时候,是不是快到,这东西就相当于是一个快照的一个组件点,当然很多东西啊还不太了解,underdog里面到底包含了什么样的一些信息。
一会儿我会通过画图的方式,给大家做一个完整的描述,你记住原子性是通过undo log来实现就够了,这是第一个好吧,那么第二个我们的一致性先扔一边,我先说隔离性,隔离性是通过什么实现,什么叫隔离性。
其实也非常好理解,比如说在并行运行的各个事物,它们之间相互独立,互不干扰啊,对不对,也就是说我一个事物在运行着,另一个事物,不能去影响我当前正在执行的这个事物,那这东西我要怎么来实现呢。
其实这里面涉及的更多的是并发相关的一些,基本操作吧,你想我该怎么做,让你自己来,实际上话你会怎么实现,好了松饼说了一个字,叫锁,确实是通过锁的机制来进行实现的,但是这有一个问题,同学们。
如果我给我们的事物加锁,会给我们的数据加锁之后,加锁之后的效率是高还是低,听到问题,加锁之后的效率是高还是低,低是不是要低,马老师之前讲事物的时候,经常讲述的时候,经常说,当你一个人上厕所之后。
他必须要等你出来之后,你才能接得上,是不是意思效率比较低,但是遇到我们这种大型的,或大量的并发处决的时候,如果我全部加锁的话,很明显效率是比较低的,因此在隔离性这块它除了用锁实现之外。
还会包含另外的一个技术点,叫做mv c c,什么叫mv cc,它的全称叫多版本并发控制好,music version control c control,这意思是叫mc s v cz啊。
有多少同学在之前面试过程中被笨到过,给老师扣,一有人面试中被问到过吗,你有没有啊,应该有吧,反正我们的vip问过我很多次这样的问题啊,所以我把这个mv c c给大家做了一个,非常非常详细的讲解。
你们之前可能有很多同学从网上搜过一些帖子,关于mc c的,但是啊我也看过一些帖子,我觉得里面说的东西并不是特别完善,所以一会儿我会拿出大量的时间来讲解mv c c,它对应的底层实现机制。
比如mv cc会成为我们这节课的重点,包括我昨天在留的那个作业里面,最后一道题想要了解的,会要讲解的也是mv c c相关的基础知识,好吧,它一会儿我们再放一边,一会再聊,它是最后一个。
还有一个东西叫什么叫持久性,这东西19年什么意思啊,19通过什么来实现,之前收到的一个名词叫做redo log,a good log,什么意思啊,这里面啊其实要保证一个机制啊,我问大家一个问题啊。
我觉得卖家问题之后,你们应该会引发大家的一些的思考好吧,首先我们的数据是存储在磁盘里面去的,当我需要去更新某一条记录的时候,这个更新的操作执行的效率是高还是低啊,听到这句话,我们现在数据是存储在磁盘的。
当我需要去磁盘里面更新某一个数据,结果值的时候,它效率是低还是高,第一把为什么低啊,这里面涉及到我们对应四川数据的一个,寻址过程吧,选址的时候他效率是非常非常慢的,非常非常慢的,但是你要去思考一件事。
同志们什么事考虑好了,我每次我在进行更新操作的时候,更新操作的时候,我需要把数据从磁盘读取到内存里面去,我现在内存里面发生对应的修改,内存里面先更新完成,更新完成之后,它会变成脏液,变成商业之后。
我需要把内存里面的数据,刷新到我们的磁盘里面来保证数据的一致性,假设我在进行寻址的过程中,突然mysql挂掉了挂了,如果mysql挂掉了,我问一下这条数据,他还没来得及写磁盘。
那么这条数据是成功了还是失败了,成功还是失败,失败了,那市面肯定不行啊,你说你msl换了老师,我重启,当你重启之后,你怎么样能够保证我能够把数据给恢复回来呢,能保证吗,不能我说过了。
这个往c盘里面更新数据是非常非常慢的,你没办法把它进行相关的一个恢复,所以此时就有了relog这样的一个东西啊,在讲主义log之前,我还是要说明一件事,什么叫有报告,它也是存在磁盘里面的一个日志文件。
比如说我每次在往磁盘里面写数据之前,我需要先往日志里面写一份,然后我再往我对应的磁盘的数据文件里面写,这就会有一个问题,你们会有疑问,老师我既然他也要写一份文磁盘,我的实际数据也要写一份磁盘。
那为什么我要它来保证我们对应的数据呢,我对应了我们数据的完整性呢,写数据不需要浪费时间吗,为什么呢,这里面一样的也涉及到了io的问题,什么io我们在进行读写操作的时候,其实分为两种基本操作的i o操作。
一个叫做听好了,随机,io还有一个东西,还有东西叫做顺序io,这个随机io和顺序啊到底代表什么意思啊,啊什么叫顺序,什么叫随机,比如说我有一个非常庞大的文件,是文件里面有11条记录。
现在我要去里面更新某一条记录,是不是相当于我在这些文件的某一行或某一个,位置里面进行修改,那此时我需要干嘛,我需要想找到这个位置,我才能够去写,光寻找这个过程就会浪费很多的时间哦,这东西叫什么叫随机。
l还有另外一种叫什么叫顺序l,什么叫顺序l,我直接不管你当前文件里面,我存储了多少数据了,我所有新增的数据都直接往后面进行啊,p的操作啊,碰到什么意思,什么叫分的追加吧,要是我直接往里面追加。
和我在中间某一个位置里面进行插入,你觉得哪个效率高,哪个效率低,那个那个b肯定是按p的高嘛,是不是这个意思好,可以这样看得到顺序的,它的效率是比我们随机要快很多的,之前也看过一个帖子。
帖子里面是这样描述的,revlog redo log,我觉得这个描述也非常准,非常准确啊,我给大家说一下,举个例子啊,vlog它相当于干了一件什么事情,举例来说明,听好了,假设啊你干了10年程序员。
到30岁之后,存点积蓄,有个一两百万是吧,一两百万之后感觉不想在北京混了,回老家了,回老家之后你也不知道干别的,不知道干啥,在你们村里面开了一个饭店,开饭店之后你要考虑一件事情。
村里的人呢都是左邻右舍好,或者说都是亲朋好友,这时候一般人来吃饭,他其实是不会干嘛,直接结账的,他一般会赊账,那3万的话,就意味着,你自己一定要有一个非常非常厚的账本。
账本里面一定记录了非常非常多的一些数据,当某一个人过来赊账,或者说比如说吃完饭了,他说哎小二来给我记一下账啊,我月月底的时候一块截给你,你如果去当前这个非常厚的账本里面,你去找到对应的这个人。
在进行对应的数据修改的话,你告诉我效率低还是高一汉高,肯定很低吧,因为你要找嘛,我说了很透的账本,很多很多肯定是非常低的对吧,那这个时候大家想,如果你是饭店里的生意比较惨淡。
一天可能就两个人来吃饭也没关系,我们玩转嘛,时间是来得及的,假设在中午或者晚上的时候,客流量非常大,来吃饭的人非常多,记账的人也非常非常多,这个时候你去账本里面找,你觉得还来得及吗,肯定来不及了。
一堆人等着排队买单,你肯定是来不及的,那这个时候怎么办,你能不能在你在前台上面,或者在你的柜台上面,你挂一个比较小的黑板,黑板是干什么意义的,当一个人需要来赊账的时候,你就让他赊市场所。
你并不是去账本里面进行相关的数据修改,而是把当前这个人的信息你进入到黑板里面,来一个人记录一条,来一个人记录一条,来一个人记录条,一直往黑板里面进行追加,当中午的客流量高峰过去了,你比较空闲了。
闲了没事干了,能不能再慢慢的把当前这个黑板上面的数据,再重新写到你自己的账本里面去,能不能可以吧,你觉得往黑板写和去账本里面找哪个效率高,哪个效率低,是不是肯定要往上面来写,效率高一点,明白意思吧。
所以relog就相当于做了这么这么做这么一件事,当我有数据来了之后,我先写到redo log里面去啊,哪怕我账本里面数据没有更新也没关系,将来有时间了,我把我revlog里面。
或者把黑板里面的数据慢慢进行一个誊写,而不需要花费大量的时间,去账本里面找具体的数据来进行数据的更新,这是我们revlog存在的一个意义和价值,来这个redo log听明白,同学给老师扣一,能听懂吗。
胡巴没听懂没听懂,说哪个没听懂,对呀,这是它存在的意义和价值,一定要把这个逻辑关系搞清楚了,一定要搞清楚,这点很重要很重要,因为在行进行实现的时候,里面有个东西叫clash safe。
它就是用来进行数据的一个存储的,对不对,就是为了解决我们class safe这样一个问题的哇,实时性咋办,他不需要什么实质性,还是那句话,我们为了房子是什么事情,如果你能找得过来,你当然是找了。
如果你找不过来怎么办,听到这个问题啊,如果你找不找得过来,没问题,你可以找,就这意思啊,你往磁盘里面写的时候,如果你能写进去,没关系,你就往里边写,如果你写不进去,突然断电宕机了,你怎么办。
你黑板在你的数据是不会进行丢失的对吗,是不定式的,并不是说我写到redo log里面去之后,我就不往我的账本里面写了,我依然往我的账本里面写,或者我依然进行数据的一个同步,只不过我是为了保证我中间。
这个过程出现问题之后,我能够进行数据恢复的,是这意思,明白了吗,哇放大说redo log会整理数据吗,它不会整理数据,redo log它有一个东西叫什么叫循环写,比如说vlog是什么。
是一个固定空间的文件,固定空间的文件,它固定空间,这意味着我一直往后面进行追加,假如说我追加完成了,这下完成了满了满了怎么办,会把我之前的数据给干掉,干掉之后我依然进行循环写,那这时候就不要问了老师。
如果我的relog我没写成功怎么办,如果relog是不是,如果你的redo log也没写成功,你实际的数据文件也没写成功,那数据丢了就真的丢了,就会产生数据丢失的问题,明白了吗,就产生数据丢失的问题。
这也是没办法的是吧,任何数据库,你不可能严格意义上,从任何一个维度解决他数据丢失的问题,是不可能的,所以他只是有这样的一种机制,明白吗啊那这时候有同学问老师,你刚刚提到了redo log和blog。
他们一个位于server层,一个位于的是印度db存储引擎层,他们两个位于层次不一样了,那我在记录了redo log之后,我的blog里面还是否会进行记录呢,挺好啊,如果我记住了redo log。
我的blog里面是否还会记录数据,会不会,会吗,会的会的,也就是说你的blog和你的redo log边都会记录数据,如果都会进入数据的话,那么会有什么问题吗,啊干饭魂,听好了,会员啊。
blog和redo log里面都会同时记录数据,当你同时记录数据之后,会有一个问题,什么问题,我是先写re redo log,还是先写blog,先说好,听到的和redo log都会同时记录数据。
好那么他们记录的顺序是什么样的,你告诉我,就是说我到底先写谁后写谁啊,现在blog啊,现在人都log,这个问题记住了,它是一个坑,不管你先写锐度还是写病都有问题,都有问题。
所以在这里面会涉及到另外一个问题点,在面试中问的也比较多,什么东西呢,这二两阶段提交这东西啊,不是分布式事物里面那个2000的提交,它就是2000的提交,比如说blog和成都log。
要保证他们两阶段提交这件事情,其实一个另一个没有写吗,注意了,你两个日志数据里面要不然都写,要不然都不写,如果说一个写了一个没写,你要判断一下它到底能否生效,或者你的数据到底是否最终是一致的。
这点很重要啊,所以这是刚刚我在ppt里面列的第二个问题,什么第三个问题说什么是二阶段提交,如何保证当机时数据的一致性。
我刚刚说过了,redo log,它是为了记录或者为了阻止,反而是safe的存在,你说我如果在中间的过程中断电了怎么办,我可以根据我们的工作log来进行数据的恢复,对吧,冰老师干嘛的。
它是为了进行主动复制或者进行数据恢复的,还有数据恢复的功能,他两个在进行操作的时候,两个日志会同时写,就意味着我在进行恢复的时候,要根据两个日志来判断,那这里面就会存在一个问题,我到底先写谁后写谁。
欢迎再打一张图给大家看一下啊,之前我讲过这个东西,来给我看一下,来看这张图,这是之前我在讲vip课的时候,给大家画一张图啊,大家看一下,比如说当我在进行数据更新的时候,它是包含这样一个更新流程的。
第一步我要先获取数据,获取数据的时候,要判断一下当前数据是否在内存中,如果没有的话,我需要把磁盘里面的数据加载到内存里面,然后我要去修改我们的数据,同时要写入新的数据,写写程序的时候一定是先写内存。
写完内存之后,我才会往磁盘里面投放在这里面,我在写这两个日志文件的时候,分为了三个步骤,就下面这三个步骤会变得很重要,第一个步骤他怎么做的,叫先写redo log,处于prepare状态。
然后再写blog,然后当你提交事务的时候,我再把我们刚刚的图片状态置为commit状态,所以这时候你就要考虑清楚一件事,他为什么要进行这样的设计,或者说这样的设计它到底有什么样的好处,他保证了什么事。
其实你可以做一个思考,其实你可以做一个思考,什么思考。
系列 6:P89:MySQL的redolog、undolog、binlog分别有什么作用? - 马士兵学堂 - BV1RY4y1Q7DL
刚说的东西,假设两个日志啊,我明确了都要记住,我如果先写redo log进行,然后再写blog对吧,建议大家写写他这样两个方式,如果再这样写的话,这里面会有一个问题,同学们听好了,什么问题。
如果我写完redo log之后,突然啊写完do log还没来得及写vlog的时候,我突然断电了,这时候会发生什么情况,解压,当写完redo log没有写完blog的时候,会有什么情况发生。
你觉得会有什么情况发生,注意啊,我的revlog里面写完了,写完之后,我一定会把它一写到我们磁盘里面,就算我在一写磁盘的时候突然断电了,我的road log里面只要有数据或只要有对应的记录。
那么我是可以根据redo log来进行重启的,但是你要考虑一件事,你写完的redo log,你的blog里面是不记录对应信息的,那这个时候假设你有两台机器,a的操作,a机器和a服务a数据库是吧。
然后b数据库,是通过什么blog来进行数据同步的,此时你考虑清楚了,当他写完了,他没写完,你的b数据库在同步数据的时候,会不会代表这一条数据会反而不会,对位,不会如果不会的话,就会出现一种情况。
什么情况,你的a数据库里面已经做完了这条更新操作,但是你把blog同步到b机器的时候,你的b机器里面并没有这个操作,你告诉我你ab两个机器里面数据还一致吗,一致位置了,不一致了吧,那不一致。
你的主从同步不就失败了吗,不就存在对应的一个问题了吗,是不是这意思啊,所以它是不可以的,不能先写日志log再写blog,那其实反过来道理也是一样的,如果我先写了blog,然后后面我再写我的logo。
这种情况一样的吧,什么叫一样的,想好了,我先写完blog,然后没有写完redo log,这时候是什么情况,你blog里面记录了对应数据,blog记录了对应的数据,是b机器,我b服务器b已经将数据同步。
但是redo都没有,此时如果出现了凡是safe,或者说如果出现了断电,出现断电之后,你告诉我,你能够根据blog把数据给恢复回去吗,这个问题啊,你当你断电之后,你能够把你根据blog把数据给恢复回去吗。
能不能,不能吧,你连数据嘛肯定会受不了,他恢复不了,意味着a g g是a的,数据是有问题的,少一条,但是你的blog已经同步到b机器里面了,b机器里面是不是会多一条记录或多一个操作。
此时你的ab两个里面的数据还一致吗,一致位置,这又不一致了吗,是不是这意思啊,所以不管你先写日blog还是先写blog,它都是有问题的啊,所以这种机制有问题,因此才诞生了,我刚刚给大家展示的东西。
什么呢,叫两阶段提交,什么意思,我先写redo log,只不过此时我的redo log,它处于的是叫prepare这个状态,然后我再写blog,当我把blog写完之后,我事务提交了。
我再把我们的redo log置为commit状态,那在整个这个执行过程中,依然在任何步骤的时候,都有可能会出现断电情况,比如说这儿如果断电了,可以了,听好了,这如果断电了,当这断电之后。
我需要做什么判断它的运行机制是这样的,听好了,如果在此处出现断电了,那我在恢复的时候,我会先检测我的revlog,我只do log里面状态,我简称log之后发现当前的relog属于普片状态。
当它处于普片状态之后,我再去blog里面找对应的数据,比如blog里面是否同步记录了与之相同的操作,如果有,如果有,那么此时把刚刚review里的prepare状态,改成commit状态,如果没有的话。
干什么事,把刚刚redo log里面的prefer,这条日志直接置为失效,我直接认为无效数据,这样的话,我的real log和我们的blog能不能保持保持数据一致,可以吗,这是刚刚这个断电的过程。
那样吧,在下面这个步骤里面,它也很不断电,当它断片之后一样逻辑,我先找一个log,我一找诶,发现一个log里面有图片状态的数据,这时候我在找blog里面找,我一找blog。
blog里面是不是有对应的记录,有对应记录怎么办,把刚刚的prepare状态的数据改成commit状态,这样的话两条数据记录都保持了完全一致,所以不管你依靠哪个数据来进行,数据恢复的时候。
他都不会出现数据的不一致性的问题,这东西就称之为叫两阶段提交,这东西p班同学给老师扣一,能听懂吗,所以啊这东西在面试中也会经常被问到,你要给面试官把这东西给讲清楚,它对应它对应的东西。
老师redo和blog pupa团队的方式能替换吗,不可以,因为blog他没有prepare这样一个状态,blog没有prepare这样一个状态,没有prepare一个状态好吧。
所以他不可以互换位置好了,这个两阶段提交这东西我做了这么多,所以当提到这个logo的时候,你要把blog整合起来,了解一下它的两阶段提交就可以了,vlog在sl单链中还有吗,它是持久化到磁盘的。
怎么会没有呢,它是持久化到磁盘的,所以一定是有的,注意断电之后数据丢失的话,只会把内存里面的数据也丢失掉,你磁盘里面的数据是不会发生丢失的,所以不用担心这件事儿,好吧好了,刚刚我解释了原子性。
通过undo log来实现隔离性,通过mv c c加锁来实现持久性,通过relog来实现,但是我唯独没有提一个东西,就是我们的一致性,这里面我要强调一件事,同学们听好了,这里面我们写一句话,记住了。
为什么一致性没有写具体的实现方式,这边有很重要的一句话,一致性是我们根本的追求,一致性是实现,方式是由其他三个特点来保证的,明白意思,也就是说它没有什么具体的实现点,其他三个特征共同保证了我们的一致性。
问题来这儿能听懂,同学扣一能听懂吗,赶快记一点好不好,当这些问题都聊完了之后,下面我们进入到一个环节,什么环节,我们就要讲一下我们的mv c c这玩意儿啊,重点聊一下m c的这玩意儿。
m c c坦白说还是有那么一丢丢复杂的,好同学在了解m c c的时候,其实怎么说理解的都有多少有点有失偏颇,那今天我们重点把nv acc对应的实现机制,给大家讲清楚啊。
m v c这玩意儿m c刚刚不是多多,我都说过了啊,现在了解奥特fm v c c刚刚解释过了啊,什么叫mvc c,它的翻译是什么线程锁吗,不是跟县城所没有关门的关系,它叫做什么叫多版本并发啊。
这它对应的一个全称啊,既然涉及到并发了,那这里面会有一个问题,同学们数据库里面的并发大概分几种情况,听好了,数据库里面的并发大概分几种情况,这是什么,有多个事物在进行同时操作的时候,有几种情况。
三种哪三种啊,第一种叫读读是吧,第二种叫读写好,第三种叫写写,这都是我们产生这种并发读取的时候,要产生的一些操作,比如说同时读都是读还是都是写,还是有读有写啊,这样的一个这样三种情况。
那这样的情况我们要解决问题什么问题,这三种情况在进行并发操作的时候,它会有对应的问题吗,比如第一个读读会有数据安全问题吗,他需要进行并发控制吗,需不需要不需要不存在任何问题,也不需要并发控制。
因为你在进行数据读取的时候,它并没有实际的改变我们的数据值吧,所以不需要了是吧,那第二个读写会有问题吗,有吧有数据安全问题,幻读不可重复读啊,都是这种各种机制里面它要存在的一个问题啊,这东西还有第三个。
写写写写会有问题吗,有没有有有数据安全问题啊,可能存在丢失而叫更新丢失问题,就说是存在这些对应的一些情况的,当存在这些对应情况之后,我们总要考虑解决方案,对不对,在考虑解决方案的时候。
你就想什么解决方案,最普通的方式我可以通过锁的机制来实现吧,比如说加速锁是可以解决这个问题的,但是我在使用锁的时候,明显有一个问题是什么,效率低吧,是不是效率低啊,那如果我想保证我的效率足够高。
我应该怎么办,怎么做,换图的问题,一会来解释,别着急好吧,锁它的效率一定是很低的,但是这个时候你可以联想一下,你之前在java那种并发编程的时候,java里面在进行并发编程的时候。
你除了可以加那种cd带子这样的一些锁之外,还可以干什么事,好了,话费提成说的一个东西叫c a s cs叫什么,叫compare and sweep,其实我们的mv cc类似于这样的机制。
就是说他不需要去进行加锁,当然在mc里面它并不是进行对比的,只不过它减少了我们所对应的一些存在的问题,就是说它是用来解决加锁这样一个问题的,明白意思吧,跟cs不一样,但类似的机制是一样的。
类似的机制是一样的,那到底它怎么实现呢,实现的方式非常简单,刚刚有些同学提到了格林级别,隔离级别的东西,我希望同学们能够一会儿再聊,我们一会再聊隔离级别相关的问题,先扔一边。
等需要聊的时候再来隔离一边不需要聊,先不聊它好,在讲mv c c对应的实现原理之前,我需要同学们先具备两个最基础的概念,第一个概念叫什么叫当前读,第二个概念叫快照读,比如说你必须要把这两个名词搞清楚。
什么叫当前读对了是啥意思啊,是不是当前读记住了,所谓的当前读,表达的意思是说在进行数据读取的时候,读取的都是最新的版本数据,记住啊,这最新的版本数据啊,而且在读取的时候,还要保证其他并发事务不能够修改。
我们当前的这些记录,会对我们读取的机构进行加锁操作,这叫当前读,除了当前组之外,还有第二个概念,叫什么叫快照读,那什么叫快照读啊,一个人读最新的数据,那快要读读啥,读什么,对读取的是历史版本的数据啊。
是有可能读取到对应的历史版本数据的,好吧,那这里面会有一个问题,老师什么样的操作会触发当前读,什么样的操作会触发快照读呢,注意了,这样说明一下,我们当前读触发操作有以下几个,写一下,第一个。
比如说sl lock in shell model,什么意思,加读锁吧,比如说select for update加解锁吧,比如说我们执行的update操作对吧,d类的操作对吧,包括音色的操作。
像这些操作在进行操作的时候,都都都基本上都是当前读光线图,它变成快照读,那什么时候会触发我们的快照读呢,也非常简单,它有且仅有一个什么东西呢,叫select,注意。
最普通的select有可能触发的是我们的快到数据,而不是我们最新的数据,有人有这样的感受吗,就你读到的数据是旧的数据,有人这样的感受吗,你之前在操作数据库的时候,有读到过旧的数据吗,有没有。
想想回忆一下有没有,如果你说没有,那么我就要给大家举例子了,好如果你说没有调举例子了,橘子来看一下它到底是什么样的一个情况。
已经算相,但还是旧的,是这样的情况,来看好这个例子啊。
下面我来举例子说明了还是一样,我们不可能光讲理论知识,还是要带点实操的好吧,let’s go,boa杠p,我来演示一个场景。
你来告诉我对应的关掉了,我来演示一个场景。
你来告诉我,对应的答案和对应的效果分别是什么,认为很重要好吧。
来了两个窗口同时进来。
mexico杠u root杠p123456 。
进来进来之后,我们use demo这个数据库,然后呢在里面我去创建一张表,grade table ut 18连接方案。
90的id int primark。
内部卧槽。
这个sql已经足够简单吧,我觉得这个sql语句有人看不懂吗。
没有吧,足够简单了啊,然后insert into t18 values。
写这个值一根号一。
三好了,往里面插入了三条,结果三大将from t18 没问题吧。
这边也是一样的,select。
七from 718。
两边数据一样不一样,告诉我两边数据是否一致,一样吧,没有任何的一个区别好吧,下面我要做一些最基本的操作了,第一个操作是干嘛,我们为了模拟事物的一个执行过程,或者执行情况。
我需要把自动提交事务的按钮给关闭掉,所以叫set auto commit等于零走。
然后commit一下,我现在把事务自动提交给关闭掉了,当我关闭掉之后,我为了模拟两个事物,a b是两两个,这是两个窗口,一个a一个b,那么我能不能手动的去开启我们的事物啊,我能主动开启事务吗,可以吧。
两种方式,第一种start的反击是第二个begin。
我依然执行begin操作,当我开启事务之后,我的问题来了,同学们,现在我开启了一个新的事物,两边数据是否一致,你这个意思你知道吧,这个没啥问题啊,肯定是一致的,如果一致的话,我们就要考虑一件事。
我在第二个窗口里面,我做一个up不对的操作,比如update t18 set name等于连,然后结束,我现在更新完成之后,两边的数据是否还一致,现在一样吗,有人会说老师应该不一样吧,为什么。
因为你从右边窗口里面是我没提交,我现在把它给提交掉,我的问题听好了,问题来了,当我这边提交完成之后,我在这边进行数据的查询,我查询到的是零还是123,告诉我零还是123,来各抒己见好吧,翻翻你们的看法。
好了,有说连的,有说123的,但是我看到的情况是123的,情况应该是偏多的,但是实际查询起来你的结果它是连,并不是123,还有刘娜说,老师要看隔离级别,这块跟隔离级跟隔离级别没有半毛钱关系。
没有半毛钱关系,我先问一下我们当前的隔离级别,mysql默认的隔离级别是什么,什么查一下嘛,flat at concision,什么repeatable read,因为我从来没有改变过合理的级别。
所以别的级别是一模一样的。
没有任何一个区别,这样你首先要记住了,好吧,先把这个记住来,现在我把两边的事物全部提交掉,commit我在演示另外一种情况,看好了另外一种情况,什么情况,我现在都commit掉了。
我同时再开启我们的事物,开启之后我看一下我们的数据,三星和t18 ,现在数一样吗,现数是一样的一样吧,一模一样,隔离级别我也没动过,我依然在第二个窗口里面,我做一个更新操作,update t18 。
set name等于合合的走,我一样在提交,我现在读取到的结果是123还是连,什么,连是吧,失联了失联唉,为什么,为什么在刚刚这里面的时候,我就可以读到最新的数据,为什么在这的时候我就读不到最新数据了。
听好在我第一次演示的时候,它是可以读到最新的数据的,修改之后的数据,但在第二次的时候。
我就读取不到修改之后的数据了,你在这边进行查询的话,他已经改了,他的数据明显就不一致了,小福利说数据库bug,怎么可能数据库bug。
这里面其实涉及到的就是当前读和快照,读的问题,跟缓存没有半毛钱关系,这也是mv c c它存在的一个重要的原理,重要的点好吧对,区分点是什么,是我在读取之前,我进行了一次查询操作。
为什么我执行一次查询操作之后,就能够达到当前的事物,但是达达当前实现效果了,原因是什么,这个原因在于mv c c。
在下面我要详细的去讲一下,mv c c具体的实现机制。
你准备好了吗,想搞明白刚刚为什么会出现这种情况吗。
为什么我多执行了一次查询操作之后,两次结果就不一样了,来想知道的扣一请结一下自己好吧。
这时候核心点和重点来了,来先说m c c m c c在进行底层实现的时候。
它总共包含了三部分操作,第一部分叫什么叫隐藏字段,什么叫永恒之断,也就是说,在我们的m v c c进行实际操作的时候,他其实除了我们看到的字段之外,会包含一些包含一些我们看不到的字段,看完自然有几个呢。
有很多这块我重点说三个,第一个什么叫db下划线,t r x下划线a b这是第一个隐藏字段,它要表述的我看表示什么意思呢,其实非常简单啊,表示什么叫自创建这条记录啊,或者最后一次修改该记录的事务id。
这是第一个字段要表示的意思,还有第二个隐藏字段叫什么叫db下划线,roll下划线p t2 ,他表示什么意思,它叫做,做完了这个回滚指针好吧,指向数据的上一个版本,上一版本都一样的。
还包含第三个字段叫db下划线,我昨天说过的东西叫roid吗,什么意思啊。