00:00
行,那么circleq呢,在MYQ当中这个执行流程啊,咱们就说到这儿了,然后接下来呢,咱们做一个了解的内容给大家呢,说一下这个Oracle当中circleq的一个执行流程啊,了解是吧,来做一个拓展啊呃,那么Oracle当中他提到一个概念呢,叫做共享池,这个呢,是咱们MYSQ中不具备的,整个在流程的话呢,我这放了个图,打眼一看的话呢,跟咱们MYSQL中啊,这个过程还是很像的啊,那具体细节的话呢,还是有区别的啊,比如说我们这个SQ语句过来之后呢,它首先呢进行一个语法检查,语以检查,权限检查啊,这个呢,整体上来看呢,有点类似于咱们的解析器,对吧?啊,MYSQ里的解析器。接着的话呢,它有一个叫共享池的一个检查,这个共享池的检查呢,先泛泛的来讲,它类似于咱们MYSQL中的这个查询缓存。啊,类似于这个查询缓存。嗯,这个应该明白这个意思对吧?嗯,当然呢,还是有区别的啊,就是这个查询这个共享池检查,这个咱们就先泛泛的说啊,如果说呢,这个这个检查完以后发现呢,没有对应的一些缓存,那这时候呢,干嘛只能性解析了,这个硬解析的话呢,就意味着就像咱们没有找到这个查询缓存中的这个命中数据一样,哎,我们就需要呢,诶执行这个优化器生成一个执行计划,然后做一系列这个操作。
01:14
然后呢,你把相关的这个呃,SQL语句,还有这个执行计划呢,还缓存到我们这个共享池当中,那如果说你在这个共享池里边找到了你这个SQL语句了,那我们就可以呢,直接进行这个叫软解析了啊,所以这个硬解析软解析就类似于我们查询缓存当中命中还有命没命中这样的一个情况。行,那具体这块呢,我就不多去说了,那主要呢,我们就看来来看,这个叫共享池这个概念,它的主要作用呢,就是缓存SQL语句呢和该语句的这个执行计划,MYSQL当中呢,只缓存了这个SQ语句,没有缓存这个执行计划啊这里边儿呢还缓存了执行计划。呃,那么我们具体这个操作步骤是什么样子呢?啊,怎么决定软解析和硬解析呢?首先呢,我们针对这个SQ语句呢,进行一个哈希运算啊主要呢,是找一下我们现有这个库缓存当中啊,有没有我们当前这个搜Q语句对吧?那如果找到了呢,我们就直接啊执行已经存在的这个呃SQL语句的执行计划就可以了,那这个过程呢,我们就称为它叫软解析,那你也能够想到什么叫硬解析呢?就是咱们没有找到你这个SQ语句和对应的执行计划,那你就是不是需要呃使这个这个老老实实的在这个优化器当中进行一个诶优化是吧,诶使用这个。
02:26
生成一个这个执行计划,然后接着呢去做这个执行。OK,就是这样一个环节,这呢叫做这个硬解析啊,叫做硬解析。当然了,我们希望的话呢,是不是说呢,尽量避免使用硬解析,然后呢,呃,尽量呢,我们能够生成这个软解析,对吧?那具体怎么做呢,咱们等这说啊,呃,除了这之外的话,我们再提到一个共享池,它其实主要是两个作用,一个呢,就咱们刚才提到的一个库缓存啊,硬解器软解器的事儿,还有一个呢,就是呃,数据字典的一个缓冲区啊,也是在我们的共享池当中的,这里边就提到了奥瑞当中常用的一些数据字典了,咱们再讲上篇这个视图,那时候呢,我们提到过数据库对象。
03:05
啊,其中呢,诶一个呢叫数据字典,它呢就相当于咱们系统提供的这个表,那比如说我们这优色表啊,DB表啊是吧,就是这个权限表啊,就属数据字典了,那么Oracle呢,在整个咱们写这个业务相关的这个S库语句用到这个表之外呢,肯定是不是也会用到一些系统表啊,那我们就称为呢叫数据字典了,那此时的话呢,我们这些表的话呢,也会提前加载到这个缓冲区当中,当我们在跟业务相关的这些表的操作的时候呢,诶很多时候呢,我们需要调用这些数据字典。啊,调用这个数据资源啊,就有点像比如Java层面,我们自己定义的这个类呢,在加载的时候呢,是不是里边多多少少你会加载很多的,呃,咱们JDK当中定义的这些类,比如object呀,比如说这个啊是吧,等等很多类呢都需要加载,而这些呢,就提前我们相当就已经啊加载到我们的内存当中了啊放在这个共享池里边,那提高了我们查询的一个效率,对吧。好,那么我们还回到这个这个这个诶库缓存这块啊,相当于还说了两个事儿啊,这个供养池里边呢,它包括两个东西,一个呢叫做库缓存,一个呢叫数据字典缓冲区啊,这个呢说完了,然后我们再回到这个库缓存这块,刚才呢提到了说我们尽量呢,是不是少用这个硬解析啊,要能用软解析呢是最好的,那怎么尽量避开硬解析,使用软解析呢?这里边儿提到一个特色,Oracle里边的啊,我们可以通过绑定变量的方式。
04:24
啊,然后尽量的让他去命中这个circle,举个例子,比如我们这呢,有个查语句啊,这样写的是吧,咱们讲RA讲my circleq的时候呢,提到了就是我加一个空格跟不加空格是不是相当于两个不同的circle扣啊,那咱们在这个Oracle当中啊,比如说我们这块呢,想查询出来的,呃,这个位置,这个位置的话呢,呃,这个叫10001,那一会我们想查10002啊,显然是两个不同的circle了,但是呢,我们可以通过一个变量呢,去表示你这里边这个变化的呃,变化的位置。其他不变的位置呢,我们就把它固定写死。啊,那这样的话呢,我们这个SQL语句,呃,相当于呢,就可以使用一个软解析的方式了,比如说我们现在呢,是想查询要10001,那我们就用这个,然后一会儿呢,想查询10002还可以用它。
05:09
啊,通过这样的一个方式呢,我们是不是就避免了再次进行这个优化器执行,呃,这个出现这个执行计划这样的一个环节啊,就是尽量的使用了这个软解析啊这样一个。啊过程啊呃,通过绑定变量的方式呢,来减少硬解析减少啊,咱们Oracle的一个工作解析量啊,提到这个达到一个效率提升的一个目的。但是的话呢,它还有对应的一些缺点,比如说你使用这个动态搜库的方式呢,因为参数的不同啊,参数的不同导致了咱们这个搜库的执行效率呢不一样啊,也不太稳定啊,优化的时候呢,会存在一定的困难。啊,但是整个来讲呢,如果我们批量的去操作啊,类似于一个模板似的啊,类似于像呃在Java里边,比如有有时候我们编写的时候呢,是不用这种所谓的叫占位符是吧?诶那前面这个呢,相当于我们可以进行一个缓存啊,效率呢确实会提升啊,尤其是你这个批量呢操作的时候呢,这个呃效率呢就会更明显一些。
06:07
好,整个的话呢,这块大家做一个了解就可以了。然后接下来的话呢,我们提到一个叫数据库的缓冲池,对应的英文呢,叫做buff啊缓冲池。这是一个什么概念呢?啊,这个呢,呃,其实呢,简单来说就是咱们呃这个CPU使用的这个数据啊,直接呢,我们要来自于硬盘的话呢,是不是不太靠谱啊,硬盘我们说这个数据呢,读写是非常慢的,那我们中间呢,要加一个是不是内存啊,诶这样的概念,那我们比如说现在这个是咱们MYSQL这个数据库服务器了,现在呢,我们想操作这个具体磁盘啊,文件系统中那个数据库数据啊,我们需要呢,先把这个数据呢,是不是加载到内存当中啊,那加载内存中的时候呢,我们就可以把这个数据啊做一个缓存,诶然后呢,诶这个数据呢,被我们MYSQL数据库服务器呢,还调底层这个CPU呢,去做相应的这个执行。那么我们这里边儿呢,在内存级别的缓存呢,哎,其实对应的呢,叫做数据库的缓冲池,哎就是这样的一个概念。
07:04
啊,应该比较好理解对吧,那我们提供它的目的是什么呢?诶,那是不是也非常明确,就是为了减少与磁盘直接进行IO的这样一个时间。啊,大家别觉得这个呢,无所谓,这个呢,其实是真正影响我们这个执行的时候的一个效率的点。啊,像硬盘跟咱们这个内存它俩的一个执行效率的话呢,是不是就类似于我们平时讲的叫天上一天地下一年啊,差好几百倍啊这样的一个场景。啊,像以前呢,大家如果接触过这个,呃,数据结构的话呢,和算法,咱们经常提到说你这个时间复杂度呢,是N方,你这个复杂度呢,是这个,呃,比如这个log个N啊,乘以这个N的这个呢,写前面也行啊,避免有歧义了,行,那这样呢,我们说啊,这个时间复杂度不一样啊,这个高点,那个好点,那个差点,但是注意这个时候我们讲的都是基于内存级别的,那我们说呢,诶,比如说一个好一个坏一点,但是呢,你要说跟咱们的这个硬盘和内存相比啊,这俩呢,其实都是在内存级别以上去谈的,说谁好谁坏,而我们这个内存跟磁盘这俩呢,它俩的差别非常大。
08:09
啊,我们数据的话呢,呃,能用内存,那是不是肯定不要直接从硬盘去加载啊,那这个效率是极低的,那相当于我们缓冲池的出现呢,就是来解决这个啊从磁盘加载数据这样的一个弊端。啊,OK行,这里边儿呢,还提到了一个概念啊,这个叫做页啊,或者我们泛泛的说的话呢,就叫做呃,数据页了啊就相当于这就涉及到我们缓冲池里边到底放的是什么东西,对吧,主要放的东西呢,就是我们刚才说要加载的这样一些数据,而我们表当中的数据呢,诶主要的其实咱们可以说呢,就以数据页的方式呢来进行存储的。啊,大家可能有点懵,这也是咱们算是比较早这样的一个场景下呢,引入这样一个概念啊,啊举个例子,你比如说我现在呢,Select啊行,那from一下我们这个叫employees这个表,这个表当中啊,你看咱们有107套数据对吧?啊大家你可以想象一下,假设我们这个表中的数据量呢,是非常庞大的,那么在底层当中呢,我们数据呢,就有可能这波数据呢,存储在一块位置对吧,然后下边这一块紧接着呢,诶存储在一块位置上,然后在紧接着这一块存储在一个位置上,啊下边又一块,那么这个所谓的一块一块的呢,我们先用一个基本单位来表示,那我就把它称为呢,叫做数据页。
09:20
那一个数据页的默认的大小呢,是16KB,那就相当于它可以存储16KB的这个数据啊,你就比如说就是我画框的这样的一波数据,然后下一步这个数据呢,它就在另外的一个数据页当中去存储的,这个就放在我们底层这个文件系统当中,那我们要加载的话呢,呃,也得以这个数据页为基本单位进行加载啊,也就是说如果我们想查询这一条数据呢,那你就得把这一页的这个呃数据页呢,给它加载到内存当中。哎,就是这样子的,那相当于呢,就能够说明一个点,咱们的缓冲池当中啊,其实主要放的呢,就是这些数据页的数据啊,还涉及到呢,我们有一些索引啊,就索引页啊,还有其他的这样的数据字典的信息啊等等。
10:01
啊,就是它,嗯,好处呢,刚才说过了啊,是不是就是省去磁盘IO了是吧,哎,这样个时间,然后呢,消除了CPU和磁盘之间的一个鸿沟啊这样。嗯,那么我们缓存的一个原则是什么呢?呃,首先的话呢,叫位置啊,位置决定效率啊,这个所谓的位置呢,就是内存和硬盘去比较,我们呢肯定是要使用内存的了啊,效率更高嘛,诶,所以这个呢是诶内存这样一个位置,然后其次的话呢,这块我们就提到一个点,咱们磁盘中假设你有200GB的数据,而我们的内存呢只有16GB,那你不可能把所有磁盘中的数据是不是都加载到我们的缓冲池当中啊。哎,那怎么办呢?啊,那怎么办呢?啊,那这啊,注意你看我这块写的内存有16G缓冲池呢,只有1GB,就是咱们内存啊中的部分数据,我们才需要缓存,对吧?啊那么哪些数据呢,我们需要这个缓存呢?啊这里边呢,我们就涉及到一个叫优先级的一个顺序。我们会优先呢,对使用频率比较高的热数据呢,进行加载。
11:01
啊,使用频率高的,那我们就优先把它放在缓冲池当中,因为它毕竟空间是有限的,对吧?哎这样的道理啊,也很好理解,所以呢,位置乘以频次决决定了我们这个,哎缓冲池的它的一种方案啊。然后下边呢,就提到了一个缓冲时带的一个预读的特性啊,什么叫预读特性呢?呃,比如说我们加载的数据呢。诶,就有这一波的这个数据,这个数据页呢,我们把它加载了,然后呢,我们说呃,从概率上来讲呢,它有极大的可能性呢,会使用到当前这个数据页呢,前后啊,或者叫附近这样的一些数据,所以呢,在我们这个缓冲池这个内存允许的情况下呢,我们可以呢,预先把你当前这个数据页呢,前后的这个数据中的数据呢,也啊缓存到我们这个缓冲池当中。啊,这就属于一个叫阅读的特性啊,目的呢,也是为了提升我们的这个效率对吧,诶提前呢,把数据呢放在我们内存当中啊,省着你用的时候呢,再从硬盘中呢去加载了对吧?OK。好,那么呃,首先呢,大家需要明确的就是我们这个缓冲池啊,跟查询缓存呢,完全是两回事,这个查询缓存呢,只是把咱们这个select啊,比如为代表的像这个SQL语句呢,做这个缓存是KY6啊这样的一个结构,而我们这个缓冲池呢,是不是缓存的是我们这个表中的这个大量的这个数据是吧?诶它完全是两回事啊,大家先明确一下,这个查询缓存呢,我们在8.0中呢给干掉了。
12:28
这个这个缓冲池的话呢,可是每一个版本中都是有的,8.0肯定也有啊,别整蒙了。下一个问题呢,我们来说一下这个缓冲池啊,它是如何来读取数据的。啊,如果来读数据呢,啊,前面这个环节呢,就是咱们前面讲到的这个相应的一些解析啊优化呀,然后调用执行器啊,这个执行器在调用的时候呢,我们需要底层从文件系统当中去读数据了,那此时呢,我们需要把这个数据呢,是不是先加载到内存当中。啊,那必要的一些数据,热点数据,我们就对它进行一个缓存对吧?呃,缓存的数据呢,我们接着再读到我们这个存储引擎当中,然后呢,来进行一个访问啊,返回给我们用户的使用啊,就这样个环节。
13:07
OK。行,然后这块呢,提到一个问题,说如果我们执行SQL语句的时候呢,更新了缓冲时中的数据。更新了缓冲池的中的数据的话呢,这些数据会马上同步到这个磁盘中吗?啊这就提到这个数据一致性的问题,我们把这些数据呢,加载到比如这个缓冲池当中了,呃,这呢,你要是个查询呢,没事,那如果说我们这是一个update的一个修改操作呢,那这个修改操作首先明确一点,它会先改我们缓冲池重的数据,那这要改完之后呢,我们接下来呢,呃,在这个实际执行当中,咱们会以一定的频率呢,诶再把这个数据呢,刷新到咱们这个磁盘上,这个过程呢,我们称为呢叫刷盘。啊,这里我先提到是以一定的这个频率,或者要一定的策略啊,刷新到我们这个磁盘上啊,后边咱们具体会展开给大家说啊。啊,这里边还提到一种机制呢,叫呢这样一个机制是吧。
14:02
好,然后接下来的话呢,我们看一下如何去查看和设置咱们这个缓冲池的一个大小。啊,这呢,首先区分成啊,区分为我们具体的这个存储引擎啊,不太一样,如果呢是这个MY这个存储引擎的话呢,由于它只缓存索引,不缓存数据,这个呢,咱们用的叫key buffer size。啊是吧,只缓存这个索引啊,如果呢,我们要是DB呢,那我们就可以使用叫in DB buff process,那来设置咱们这个缓冲的一个大小,那首先呢,咱们来看一下它默认的一个大小啊,CTRLC一下啊这呢,我是不是就可以大胆的在咱们8.0中去执行了,因为它跟产余缓增它可不是一回事啊,给蒙了。在8.0当中,你看它是有我们这样的一个变量的,诶这个呢,默认呢是128兆。诶,默认的是128兆,好,那你要是觉得这个呃空间比较小的话呢,咱们也可以进行一个设置,那就是一个set的方式呗,啊进行一个设置,比如说改成这个256的大小啊,你就直接把它粘过来就行啊,这个对大家来讲都不是难事儿啊,我就直接粘了,然后呢,设置完以后呢,我们再去查看啊,这时候呢,就是256了。
15:05
啊,256兆啊,那大一点的话呢,当然我们可以缓存的数据呢,是不是就更多一些啊OK。啊,在配置文件中改也行啊,接着改完之后呢,重启一下卖服务啊,我这就不演示这个了。啊,这是一个修改,然后下一个概念呢,我们提到了叫buffer铺的一个实例。哎,这是一个什么问题啊?啊,这个我一说大家就能明白啊,嗯,咱们呢,这是呃叫缓冲池。然后呢,这个用户呢,在操作的时候呢,是不是有可能是多线程的场景,多个用户呢,来访问我们这个,呃,缓存在缓冲池当中的这个数据的这个数据,那要是多个线程都来访问的话呢,这时候是不是涉及到这个数据呢,要进行一个加锁的问题啊,那一旦加锁了,是不是这个效率就会降低啊。啊,那也就是说呢,在我们这个并发访问量比较高的这个场景下呢,我们只有一个实例啊,其实是不太靠谱的。啊是不太靠谱的,那怎么办呀,我们就可以考虑呢,把这个buff铺啊,把它拆解成多个小的这个B铺。
16:04
啊,多个小的八号铺的话呢,那比如我们这拆成了这个四个,那这个线程访问的数据在这儿,这个线程访问的数据呢,在这儿,他俩呢,是不是就不用考虑这个加锁的问题了啊,就是你各自访问各自的啊这当然了,就提升提高了我们这个并发的一个处理能力,对吧?行。那么具体的话呢,我们该如何呢去拆解呢?啊这块我们就提到一个变量啊,叫inno DB buffer。那么默认情况下,我们CTRLC,咱们做一个执行看一下。我粘过来。默认情况下呢,我们这个,呃,八块铺的一个实例的个数呢,你看它是一个一。对吧,诶它是一个一,那我们要想给大家做一个拆解怎么办呢?诶你可以在这配置文件中去做啊,我们在这个server这个标签下加上这样的一个声明,改成二,然后再重启一下服务啊就可以了。啊,这时候呢,我们自动的会有两个,那有两个的话呢,大家可能会问说呢,咱们刚才设置的这个buffer呢,是256兆是吧。
17:00
呃,然后呢,如果我们哎一个M啊,如果我们呢,设置这个实例呢,是个二了,那这就是每一个都是256吗?还是怎么着呢?哎,注意不是啊,咱们总量呢是256,你要是设置成俩的话呢,相当于一个呢就是128。哎,是这个意思。啊是这个意思,所以这呢是我们总共的一个B铺的一个size的大小。好,这是我们说的这个问题。呃,那么这里边儿呢,诶,提到一个实际的场景是什么呢?就我们这个包包铺啊,也不是说创建的越多越好,因为还涉及到这个管理的一个性能开销了,对吧,那怎么办呢?诶,那我们在实际场景当中啊,就是你的总共的缓冲池的大小,如果小于1GB的话呢,那就没有必要去造多个实例了啊,你就是即使设置了多个实例呢,也是无效的。啊,比如我设置成八个,那不好意思,你设成八个呢,也无效啊,还是就一个啊,因为这个一个GB呢,小于一个GB呢,太小了。但是如果呢,你要是设置成这个巴巴铺的这个size呢,那就我们刚才设置的这个参数。这个呢,如果你要是大于1GB的时候啊,这个时候呢,你设置多个实例它才有意义啊,你可以呢,通过咱们说的这个参数呢,去做一个设置啊,改成两个四个啊八个啊都可以。
18:10
行,这就我们说的这个场景啊,这就是诶b pro的一个实力问题,然后呢,我们这里边呢,引申出来一个开放性的一个点啊,其实在上边呢,我们也提到这个事儿啊,哎,我们呢,便于引出咱们后边讲的这个事物的概念。什么意思呢,我们现在呢,是一个查询的操作,这个查询操作呢,我们先去这个缓冲池中去找看有没有,如果有的话呢,那直接呢,就是诶。诶,就是我们这块呢,该怎么操作怎么操作是吧?诶然后这块就返回了,就不不用去加载这个应这个磁盘中的数据了啊,那如果说你要是这个缓冲池当中没有怎么办呢?诶我们呢,首先从这个磁盘当中把相对应你要查询这个数据,这个数据页呢,是不是加载到我们这个缓冲池当中,然后从缓冲池当中呢,按照咱们前面讲的这个执行的过程。是吧,还执行过程呢,去执行就可以了。那这是我们说的这个查询操作,那如果我们换成是一个更新数据的操作呢,这个操作的话呢,它也是到我们这个buffer铺当中去做一个查找。
19:07
啊查找然后更新对吧?呃,这个不存在的话呢,那你就是从我们这个磁盘中的去加载,加载完以后呢,再这个修改咱们包包铺当中的这个数据,那修改完以后的话呢,这时候就涉及到我们磁盘中的数据,跟我们八号库中的数据就不一致了。哎,我们此时呢,把这个八卦铺当中一个数据不一致的时候呢,它这里边儿呢,没有更新到磁盘中的数据呢,称为叫脏数据。啊,叫这个脏数据啊,数据呢是放在页当中,是不是叫脏这个脏页啊OK。好,这个脏数据的话呢,咱们首先明确一点,不会说呢,这个一更新这个八铺中的数据呢,我们就立马呢去更新磁盘,这个是没有必要的啊,为什么呀,你像我们这个一个数据页呢,咱们提到了是要16KB数据量呢,其实存储的很大,那我们这个更新操作有可能就只是修改了这个数据页当中的那一条数据中的呃,一个小字段。啊,只是修改这一个小字段,我就立马呢把整个这个数据页呢,给它再覆盖啊,覆写到我们磁盘上,这个成本呢,其实是很很高的,没有必要,那怎么办呢?我们是不是就呃以一定的频率啊,或者叫定期把这个呃八分铺当中这个脏页数据呢,把它是不是刷盘到我们这个磁盘就可以了呀。
20:18
啊OK,那既然呢,提到了一定的频率了,那我们就有可能会出现这样的场景,我们只是把power中的数据呢做了更新,此时呢,麦宕机了,那一旦宕机以后呢,诶我们这个磁盘中的数据呢,相当于就没有做更新,那这是一个问题。对吧,那另外一个问题呢,就是我们现在呢,比如说有好几个这个操作都需要做修改,呃,他们还得做个整体啊,其实这就我们后边要讲的事物的概念了啊,那这要是一个整体的话呢,我们在这个正在进行这个刷盘的操作,我们只是呢更新了两条数据,另外两条呢还没有更新呢,这时候呢,我们就宕机了。啊,或者就断电了,对吧,那怎么办呢?诶理论上来讲,我们需要呢,把你已经更新的这两条操作呢,也需要呢,做一个回滚。
21:00
啊,大家没听过这个回滚这词的话呢,你可以先换一个词,这个叫撤销。啊,其实咱们在讲上篇tnket table和delete的时候呢,其实提到过这个词,对吧,那我们需要来做一个回滚啊,那这个回滚的话呢,那那你想想我们这个时候呢,要把已经做的这两个事儿给回滚回去,那你得记录一下你到底做了哪两个事儿啊,那么怎么回滚啊,数据都给复写了,诶这也是一个问题啊,这呢,其实就是我们后边啊讲到这一章。呃,叫做15日的时候呢,我们会提到啊一个呢,叫做relo解决咱们刚才呢,刷盘的时候呢,刷了一半宕机的问题,这个安lo呢,来解决一下我们刚才提到这个回滚的问题。啊,这个相当于我们做了一个后续知识的一个引入,啊,到时候呢,我们再来谈这两个日志文件。好,那这一章呢,咱们就算是告一段落啊,最后这个数据库缓冲池呢,大家其实也做一个了解就行啊,知道呢是怎么回事儿啊就可以了,那么大家你可能在查询一些帖子啊,一些文章的时候呢,针对这个缓冲池的内部结构啊,也有呢详细的进行了一些介绍啊,这个呢,对于呃DBA来讲的话呢,可以有必要呢做一个了解。
22:06
啊,或者有必要呢,进行一个学习,那对于我们从开发的角度来说的话呢,大家我觉得就没有必要呢,去深入那么多啊底层关于这个呃,缓冲池的底层文件结构是怎么回事了,这个就没有必要了啊这个咱们只需要呢知道啊整个的这个运行的一个机理是如何的啊就OK。那就OK了。好,那么我们这一章呢,就告一段落。
我来说两句