Mysql架构图
我们来说明这个mysql架构图,每一个部分都有什么作用
Connectors
Connectors翻译成叫连接器,
将来我们在工作中去访问数据库。并不会安装一个mysql的客户端,通过命令手工去敲命令。
大部分的用户呢,是不懂数据库的,但是他又需要访问数据库里的数据。比方说我们在网上购物,那你去购买商品下订单背后实际上都有数据库。那么,这些数据库让用户直接去访问,用户根本不会写什么语句,所以通常来讲呢,都是由开发人员。写好一个比较直观的界面,
比方说图形界面呀啊,Web界面呀,总之用我们点鼠标,输两行字儿。那么就可以把这些信息读取,或者是输入到数据库里去,当然在这个过程中这个界面。包括他访问数据库的中间的这个过程都是程序员帮我们做好的。
那么程序员他在写这个界面访问数据库的时候。就需要通过一些语言来连接,提供用户界面,并且访问数据库,那么这时候呢,就涉及到各种开发语言。比方说咱们做网站比较常见的是php啊,当然目前来讲呢python啊,包括。JAVA等等语言都可以,那么这些语言开发出来的界面,让用户访问数据库。
用户不需要去关心背后的逻辑,他通过点鼠标就可以把它。用户通过点鼠标的这种行为,咱们的程序把它最终转换成SQL语句,然后发送给数据库进行执行。
当然,那么你这些语言要连接数据库,就需要有数据库和你语言进行连接的开发接口也就是API,mysql数据库要接收这种开发语言的连接。那么,这些语言都是通过各自对应接口的来连接数据库的接口API啊,
总之各种语言都有自己的连接数据库的API开发接口。
Connection Pool
那么,当我们连接到数据库以后,用户首先要进入到第一个数据库的模块翻译过来叫连接池。
下图这个就是连接池
那这个连接池呢?那么有可能有多个用户同时发请求。那么同时发请求的话,那么咱Mysql怎么去接收远程用户的连接呢?它是靠一个叫连接池的概念,也就是它有一个一个池,这个池里面呢,可以接收多个用户的连接。
每连接一个用户过来,我就开一个连接放在这里面,当然这个连接呢是有限制的。比方说,假设我们限制1000个。假设设置1000个,那连最多也就连接1000个用户过来,再1001个,我就连接不了了。
当然,如果有1000个连过来了,我能接受,那么如果还有一个人想连,那就等着那1000个的其中一个人离开,它在连接。
比方说有一个人连接过来访问完了,他就走了,走了以后呢,这个连接的这个位置就腾出来了,腾出来以后呢,新的用户就可以连进来了。他通过这样的一个连接进来,那这个呢,就叫连接池。
那么其中呢,我们这个连接池除了连接远程用户,接收远程用户的连接功能,还提供了以下这些功能
Authentication
比方说验证(Authentication),那我们要支持你连接你光连进来不行啊,凭什么你连进来我就能接收你来处理你呢?你是不是要经过验证才可以啊?你必须要经过合法的用户印信息验证之后,才能接收你的处理的各种语句的执行。
Thread Reuse
Thread Reuse线程的复用,那线程复用什么意思呢?就是一个用户连过来,我们系统会分配一个线程。数据库呢,是以线程的方式来运行的,
也就是说,一个用户连进来,他执行命令,或者是连接进来,他都要消耗一个线程啊,当然这个线程如果没人用了,退出了,他也会把这个线程再清理清理,然后置为空闲状态,等待着下一个用户的连接,为外部提供服务。
Connection Limits
怎么理解着连接限制呢?
因为connection的连接数也并不是无穷无尽的啊,我们可以来。来约定最多有多少个用户的连接数据库,
那默认情况,它的限制比较低,也就100多个。啊,这个值设的保守,我们生产中当然适当的也要调大,但是你要调的过大的话,也会带来一个问题就是。
如果用户大量的都来了,蜂拥而至,明明你的服务器达不到那个要求,你非要设一个超大的值。啊超出了他的处理能力,就像你的饭店,明明只能接收100个人,结果呢,你对外放号儿放了1000个人。
那么,这1000个客人同时蜂拥而至,那想想这就带来的一个什么结果?是不是谁都别吃了?那1000个人都有都有这个资格,你说给谁吧, 到最后这个饭店就炸了是吧?就崩了。
Check Memory
这个表示内存的检查
Caches
这个缓存他可以把一些数据提前缓存在我们的数据库的里面,下次访问,可以速度更快
SQL Interface
就是下图这个东西
连接池接收了用户以后,那么用户呢,就可以发送SQL语句了,发送语句的时候,他可以执行这些语句。
通过SQL interface这个模块儿来处理用户发过来的请求
可以检查这些用户执行的这个语句的,这个正确与否,比方说你的语法是不是有误吧?是不是少了个分号?是不是语法是不是敲错了?
Parser
这是是有什么作用呢?
这个就是优化。如果你的语法没有问题,那么你发了一个的查询语句,我们现在我们不是直接就给你执行的。
我们可能还要做一些优化。这个优化呢,中间可能要把你写的SQL语句按照可以优化的方式。进行转换,转换一种相对更合理的啊方式,,所以它这个地方有一个解析的过程啊,解析的过程,把你的SQL语句给你解析一下。
解析完了以后呢?当然我们这个地方还有一个对象的权限的检查,比方说你去查询某个表,那这个表给你权限没有?
因为我们在上次在这个权限的时候提到过,还有一个所谓的啊,权限的级别问题可以在数据库级别。表级别甚至可以精确到字段级别,那你去查这个表,你有没有这个权限啊?你这个字段你要查有没有这个字段的权限啊?对吧?这地方都要做。相应的这个处理啊,所以这个过程,叫解析的过程啊。
Optimizer
这个就是优化的过程,这个优化的过程就是我们发过来这个指令,以后那么到底我们按照哪种方式来访问?这个访问方式呢,实际上对于我们数据库尤其查询来讲,它是有多种访问方法的,这个叫Access Paths,叫访问路径
在数据库中,它有一个优化器,这样的一个模块,这个模块可以根据你。的优化结果。
比方说他斟酌比较了多种方法,发现有一条方法是相对比较好的,所以他就会选择这条路径嗯,就像我们每个人。那选择一个适合你的路径,对吧?好,这就是优化的过程.
Caches&Buffers
优化的过程完了以后呢,我们进入到缓存啊
他会利用缓存来进行一些统计呀。包括还有一些这个优化呀,如果有缓存可以利用的话,当然缓存是比较好的。
另外呢,我们有些时候把数据要写入到磁盘里面去。可以先放到buffer缓冲区里面,过一段儿时间再写这些呢,都是我们数据库中在处理过程中它的一些这个模块。
存储引擎概念的引入
我们看最后这个部分
我们真正要访问数据的话,那么这个数据都是在通常是在磁盘上放着的
那么数据在,磁盘上放的话呢,这个数据。我们通常为了安全都是配套的,有各种日志的,所以在数据库中我们会发现有各种各样的日志。它比我们传统的应用复杂很多,传统的应用呢,一般来讲就是一个普通的日志就完了。
在数据库中,它的日志特别多。有什么重做日志、维度日志啊,这个数据包括还有索引,包括二进制。包括还有什么错误日志,等等吧,有很多。
尤其我们最核心的就是数据。数据是保存在磁盘上的,那么怎么去把这些前面我们用户发请求最终转换成?访问磁盘文件呢?那背后有一些软件帮我来实现这个过程,就叫存储引擎。
在数据库里面有一个叫存储引擎的概念,这个存储引擎是个软件模块,它可以把我们。访问磁盘上,这些数据的这些具体的形式由存储引擎来进行约定。
比方说,不同的存储引擎。它存放磁盘上的文件的格式是不一样的,那么存放文件的啊,这个类型不一样,存放的这个文件后缀不一样,存放的二进制形式不一样。内部机制不一样,不同的存储引擎决定了如何来存放在磁盘上,这是不一样的。
那目前来讲呢,比较主流的存储引擎有MyISAM和 InnoDB
我们再来看一下这个架构图,看一看