mysql的体系架构详解

一、简介

mysql是一个开源的数据库管理系统,它相对于oracle更加地轻量、成本低,随着功能的日益完善,它变得备受企业喜爱,尤其是中小企业。

mysql的整体架构大体包括以下几个方面:

1)主体结构

2)物理文件组成

3)sql逻辑模块组成

4)sql逻辑模块协调工作

二、主体结构

了解MySql必须牢牢记住其体系结构图,Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的

在这里插入图片描述

1 Connectors指的是不同语言中与SQL的交互

2 Management Serveices & Utilities: 系统管理和控制工具

3 Connection Pool: 连接池。

管理缓冲用户连接,线程处理等需要缓存的需求

4 SQL Interface: SQL接口。

接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

5 Parser: 解析器。

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

主要功能:

a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

6 Optimizer: 查询优化器。

SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。

用一个例子就可以理解: select uid,name from user where gender = 1;

这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤

这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤

将这两个查询条件联接起来生成最终查询结果

7 Cache和Buffer: 查询缓存。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

8 Engine :存储引擎。

存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。

Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)

现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB

默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。

InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。
Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。

三、物理文件组成

mysql的物理文件包括三块:

1)日志文件

1-1)Error log 错误日志:记录遇到的所有严重的错误信息、每次启动关闭的详细信息;

1-2)Binary log 二进制日志:也就是binlog,记录所有修改数据库的操作;

1-3)Query log 查询日志:记录所有查询操作,体积较大,开启后对性能有影响;

1-4)Slow Query log 慢查询日志:记录所有执行时间超过long_query_time的sql语句和达到min_examined_row_limit条距离的语句;

1-5)InnoDB redo log:记录InnoDB所做的物理变更和事务信息;
  1-6)中继日志:主从复制产生,用于slave机读取,复制master机的sql操作。

2)数据文件

2-1).frm文件:表结构定义信息

2-2).MYD文件:MyISAM引擎的数据文件;

2-3).MYI文件:MyISAM引擎的索引文件;

2-4).ibd文件和.ibdata文件:InnoDB的数据和索引;.ibdata配置为共享表空间时使用,.ibd配置为独享表空间时使用;

3)其它文件

3-1)系统配置文件:/etc/my.cnf

3-2) pid文件:存储自己的进程ID

3-3)socket文件:连接客户端使用

四、sql逻辑模块组成

mysql逻辑架构采用sql层和存储引擎分离的方式,实现了数据存储和逻辑业务的分离。宏观上可以分为三层:

1)连接处理层

2)分析、缓存处理层

3)优化器层

事实上sql层又可以细化为很多的子模块:

1)初始化模块:数据库启动时,对数据库的初始化操作;

2)核心API模块:底层操作的优化功能;

3)网络交互模块:对外提供可接收发送数据的API接口;

4)服务器客户端交互协议模块:实现客户端服务端的交互协议;

5)用户模块:控制用户连接登录和授权;

6)访问控制模块:监控用户的每一个操作,依赖于用户模块;

7)连接管理、连接线程和线程管理模块:监听和管理与客户端连接的线程;

8)转发模块:将请求转发到对应的处理模块;

9)缓存模块:将查询请求的结果缓存,提高性能;

10)优化器模块:根据查询请求计算提高查询访问速度的优化策略,根据最优策略返回查询语句;

11)表变更模块:DML和DDL的语句处理;

12)表维护模块:检测表状态、分析、优化表结构、修复表;

13)系统状态管理模块:将各种状态数据返回,如:show status;

14)表管理器:维护系统生成的表文件如:.frm文件.ibd文件…将表结构的信息缓存,另外该模块还管表级别的锁;

15)日志记录模块:负责整个数据库逻辑层的日志文件;

16)复制模块:分为Master模块和Slave模块;Master模块负责复制binary文件,并与Slave端I/O线程交互;Slave模块主要负责从Master端接收binary日志,并写入本地I/O线程,以及从relay log文件中读取日志,解析成Slave端执行的命令,交给Slave端的SQL线程处理;

17)存储引擎接口模块:实现了底层存储引擎插件式管理,将数据处理高度抽象化;

五、sql逻辑模块协调工作

如图:
在这里插入图片描述

1)mysql启动以后,初始化模块就从系统配置文件中读取系统参数和命令参数,初始化整个系统,同时存储引擎也会启动;

2)初始化结束后,连接管理模块会监听客户端的连接请求,并将连接请求转发给线程管理模块去请求一个连接线程;

3)线程模块接到请求后会调用用户模块进行授权检查,通过授权以后会检查是否又空闲线程,如果有取出并与客户端连接,如果没有则新建立建立一个线程与客户端连接;

4)mysql请求分为两种,一种是需要命令解析和分发才能执行,另一种可以直接执行;不管哪种,如果开启了日志,那么日志模块会记录日志;

5)如果是Query类型的请求,会将控制权交给Query解析器,Query解析器检查是否Select类型,如果是则启动查询缓存模块,如果缓存命中则将缓存数据返回给连接线程模块,连接线程将数据传递到客户端;如果没有缓存或者不是一个可以缓存的查询,此时解析器会进行相应的处理,通过查询分发器给相关的处理模块;

6)如果解析器结果是DML/DDL,则交给变更模块;如果是检查、修复的查询交给表维护模块,如果是一条没有被缓存的语句,则交给查询优化器模块。实际上表变更模块又分为若干小模块,例如:insert处理器、delete处理器、update处理器、create处理器,以及alter处理器这些小模块来负责不同的DML和DDL。总之,查询优化器、表变更模块、表维护模块、复制模块、状态模块都是根据命令解析器的结果不同而分发给不同的类型模块,最后和存储引擎进行交互。

7)当一条命令执行完毕后,控制权都会还给连接线程模块,在上面各个模块处理过程中都依赖于核心API模块,比如:内存管理、文件I/O,字符串处理等。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值