MySQL数据库总体架构讲义

  

一、数据库的总体架构
我们首先来看MySQL数据的总体架构如下:
MySQL数据库总体架构讲义
这是一张非常经典的MySQL的系统架构图,通过这个图可以看出MySQL各个部分的功能。
当客户端连接数据库的时候,首先面对的是连接池,用于管理用户的连接,并会做一定的认证和鉴权。
连接了数据库之后,客户端会发送SQL语句,而SQL接口这个模块就是来接受用户的SQL语句的。
SQL语句往往需要符合严格的语法规则,因而要有语法解析器对语句进行语法解析,解析语法的原理如同编译原理中的学到的那样,从语句变成语法树。
对于用户属于的查询可以进行优化,从而可以选择最快的查询路径,这就是优化器的作用。
为了加快查询速度,会有查询缓存模块,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
上面的所有的组件都是数据库服务层,接下来是数据库引擎层,当前主流的数据库引擎就是InnoDB。
对于数据库有任何的修改,数据库服务层会有binary log记录下来,这是主备复制的基础。
对于数据库引擎层,一个著名的图如下:
MySQL数据库总体架构讲义
在存储引擎层,也有缓存,也有日志,最终数据是落到盘上的。
存储引擎层的缓存也是用于提高性能的,但是同数据库服务层的缓存不同,数据库服务层的缓存是查询缓存,而数据库引擎层的缓存读写都缓存。数据库服务层的缓存是基于查询逻辑的,而数据库引擎引擎的缓存是基于数据页的,可以说是物理的。
哪怕是数据的写入仅仅写入到了数据库引擎层中的缓存,对于数据库服务层来讲,就算是已经持久化了,当然这个时候会造成缓存页和硬盘上的页的数据的不一致,这种不一致由数据库引擎层的日志来保证完整性。
所以数据库引擎层的日志和数据库服务层的也不同,服务层的日志记录的是一个个的修改逻辑,而引擎层的日志记录的是缓存页和数据页的物理差异。
二、数据库的工作流程
在收到一个查询的时候,MySQL的架构中的各个组件是如此工作的:
MySQL数据库总体架构讲义
客户端同数据库服务层建立TCP连接,连接管理模块会建立连接,并请求一个连接线程。如果连接池中有空闲的连接线程,则分配给这个连接,如果没有,在没有超过最大连接数的情况下,创建新的连接线程负责这个客户端。
在真正的操作之前,还需要调用用户模块进行授权检查,来验证用户是否有权限。通过后,方才提供服务,连接线程开始接收并处理来自客户端的SQL语句。
连接线程接收到SQL语句之后,将语句交给SQL语句解析模块进行语法分析和语义分析。
如果是一个查询语句,则可以先看查询缓存中是否有结果,如果有结果可以直接返回给客户端。
如果查询缓存中没有结果,就需要真的查询数据库引擎层了,于是发给SQL优化器,进行查询的优化。如果是表变更,则分别交给insert、update、delete、create、alter处理模块进行处理。
接下来就是请求数据库引擎层,打开表,如果需要的话获取相应的锁。
接下来的处理过程就到了数据库引擎层,例如InnoDB。
在数据库引擎层,要先查询缓存页中有没有相应的数据,如果有则可以直接返回,如果没有就要从磁盘上去读取。
当在磁盘中找到相应的数据之后,则会加载到缓存中来,从而使得后面的查询更加高效,由于内存有限,多采用变通的LRU表来管理缓存页,保证缓存的都是经常访问的数据。
获取数据后返回给客户端,关闭连接,释放连接线程,过程结束。
三、数据库索引的原理
在整个过程中,最容易称为瓶颈点的是数据的读写,往往意味着要顺序或者随机读写磁盘,而读写磁盘的速度往往是比较慢的。
如果加快这个过程呢?相信大家都猜到了就是建立索引。
为什么索引能够加快这个过程呢?
相信大家都逛过美食城,里面众多家餐馆琳琅满目,如果你不着急呢,肚子不饿,对搜索的性能没有要求,就可以在商场里面慢慢逛,逛一家看一家,知道找到自己想吃的餐馆。但是当你饿了,或者你们约好了餐馆,你一定想直奔那个餐馆,这个时候,你往往会去看楼层的索引图,快速的查找你目标餐馆的位置,找到后,直奔主题,就会大大节约时间,这就是索引的作用。

MySQL数据库总体架构讲义