MySQL高级-MySQL底层架构

本文使用MySQL版本为8.0.11

1.MySQL架构概述

        MySQL服务器由SQL层和存储引擎层组成。SQL层的主要功能包括权限判断、SQL解析功能和查询缓存处理。存储引擎层完成底层数据库数据存储操作。MySQL整体架构的SQL层和存储引擎层实际上各自都包含了很多小模块,各个模块的工作方法如下图.

(1)客户端通过连接/线程处理层来连接MySQL数据库。连接线程处理层主要用来处理客户端请求、身份验证和数据库安全验证等。

(2)查询缓存和查询分支器是SQL层的核心部分,其中主要涉及查询的解析、优化、缓存以及所有的内置函数、存储过程、触发器、视图等功能。

(3)优化器主要负责存储和获取所有存储在MySQL中的数据,可以把这3层统称为MySQL数据库的SQL层 。

2.MySQL物理文件的组成

        MySQL的物理文件包括日志文件、数据文件和其他文件。

        1、日志文件

        在MySQL数据库中,日志文件主要记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和InnoDB引擎的在线Redo日志等。

        (1)错误日志:Error Log

        错误日志文件记录了MySQL Server运行过程遇到的所有严重的错误信息,以及MySQL每次启动和关闭的详细信息。默认情况下,错误日志功能是关闭的,启动时要重新配置

--log-error[=file_name]选项,修改错误日志存放的目录和文件名称。

        (2)二进制日志:Binary Log

        二进制文件就是常说的lbinog。二进制日志记录了MySQL所有修改数据库的操作,然后以二进制的形式记录在日志文件中,其中还包括每条语句所执行的时间和消耗的资源,以及相关的事务信息。

        默认情况下,binlog是开启的,启动时可以重新配置-- log-bin[=file_name]选项,修改二进制日志存放的目录和文件名称。

        (3)查询日期:Query Log

        默认的查询日志文件时hostname.log。查询日志记录所有的查询操作,包括所有的select操作信息,体积比较大,开启后对性能有较大的影响,可以通过 --log[=file_name]选项开启。如果需要跟踪某些特殊的SQL性能,可以短暂的打开改该功能。

        (4)慢查询日志:Slow Query Log

        慢查询日志是指所有SQL执行的时间超过long_query_time变量的语句和达到min_examined_row_limit条件的语句。用户可以针对这部分语句进行性能调优。慢查询日志设置

--log-slow_queries[=file_name]选项开启后,将记录日志所在的路径和名称。MySQL默认的慢查询日志的文件名是hostname-slow.log,默认目录也是data目录。查看慢查询日志可以采用

mysqldumpslow命令对慢查询日志进行分析。

        (5)InnoDB引擎在线Redo日志:InnoDB redo Log

        InnoDB引擎在线Redo日志记录了InnoDB所做的所有物理变更和事务信息。通过redo日志和undo信息,InnoDB大大加强了事务的安全性。redo日志默认放在data目录下,通过设置

innodb_log_group_home_dir选项来更改日志的存放位置、通过innodb_log_files_in_group选项来设置日志的数量。

        2、数据文件

        MySQL数据库会在data目录下面建立一个以数据库为名字的文件夹,用来存储数据库中的表文件数据。不同的数据库引擎,每个表的扩展名也不一样。

        常见的数据文件如下:

        (1).frm  文件:无论是那种存储引擎,创建表之后都会生成一个以表名命名的“.frm”文件。frm文件主要存放于表相关的数据信息,主要包括表结构的定义信息。当数据库崩溃时,用于可以通过frm文件来恢复数据表结构。

        (2).MYD 文件:MyISAM存储引擎创建表的时候,每一个MyISAM类型的表都会有一个.MYD文件与之对应。MYD文件主要用来存放数据表的数据文件。

        (3).MYI 文件:每一个MyISAM类型的表都会有一个.MYD和一个.MYI文件,对于MyISAM存储引擎来说,可以被缓存的内容主要源于.MYI文件,用来存储表数据文件中任何索引的数据树。

        (4).ibd 文件和 .ibdata文件:这两种文件主要是用来存储InnoDB存储引擎的数据,其中主要包括索引信息。InnoDB存储引擎采用这两种数据文件,主要是因为InnoDB存储引擎的存储方式能够通过配置来决定是采用共享表空间还是独享表空间的存储方法存储数据。如果采用共享表空间的方式存储数据,就会采用ibdata文件来存储,所有的表沟通使用一个或多个ibdata文件。如果采用独享表空间的方式存储树,就会采用idb文件来存储。

        共享表空间存储通过innodb_data_home_dir和innodb_data_file_path两个参数共同配置组成:innodb_data_home_dir参数配置数据存放的总目录,innodb_data_file_path参数配置每一个文件的路径及文件名称。如果需要添加新的ibdata文件,就需要在innodb_data_file_path参数后面配置,然后重启服务器才能生效。

        3、其他文件

        MySQL数据库除了日志文件、数据文件外,还包括其他一些文件,如系统配置文件、pid文件、socket文件等。

        MySQL系统配置文件一般都在“etc/my.cnf”中。pid文件类似于UNIX/Linux操作系统下面的进程文件,MySQL服务器的pid文件用来存放自己的进行ID。MySQL服务器启动后,socket文件自动生成,主要用来连接客户端。

3.MySQL各逻辑块简介

        MySQL逻辑架构采用SQL层和存储引擎分离的方式。真正实现了数据存储和逻辑业务分离。MySQL的SQL层从宏观上可以分为3层,事实上SQL层包含了很多子模块,下面介绍SQL层各个子模块的功能。

        1、初始化模块

        初始化模块就是在数据库启动的时候,对整个数据库做的一些初始化操作,例如各种系统环境变量的初始化、各种缓存、存储引擎初始化设置等。

        在MySQL初始化过程中,部分系统参数是通过MySQL数据库系统文件设置的。MySQL系统参数可以通过“mysqld--verbose -help”命令查看当前系统所有参数的设置。在Linux平台上,MySQL数据库读取文件首先会读取 etc/my.cnf文件。

        MySQL读取完 etc/my.cnf之后,接下来会解析$MySQL_HOME/my.cnf。在这个过程中,服务器会到MySQL安装目录下面解析数据库的相关配置。MySQL启动初始化,接着会解析defaults-extra-file附带选项,修改该参数可以指定系统配置文件,接下来数据库会解析有关用户的选项。

        初始化模块是在MySQL数据库启动的时候初始化数据库的各种环境变量、数据库初始化设置、初始化数据库存储引擎的设置。

        2、核心API

        MySQL数据库核心API主要实现了数据底层操作的优化,主要包括IO操作、格式化输出、高性能存储数据结果算法的优化、字符串的处理,其中最重要的是内存管理。

        3、网络交互模块

        MySQL底层交互的模块抽象出接口,对外提供可以接收和发送数据的API借口,其他模块需要交互的时候,可以通过API接口调用。

        4、服务器客户端交互协议模块

        MySQL服务器采用C/S客户端的形式访问数据库,数据连接使用MySQL C/S客户端交互协议模块,实现了客户端与服务端交互过程中所需要的一些独特协议,这些协议都是建立在现有的网络协议之上。

        5、用户模块

        用户模块主要用于控制用户登录连接的权限和用户的授权管理。

        6、访问控制模块

        访问控制模块主要用于监控用户的每一次操作。访问控制模块实现的功能就是根据用户模块中不同的用户授权以及数据库的各种约束来控制用户对数据的访问。用户模块和访问控制模块结合起来就组成了MySQL数据库的权限管理功能。

        7、连接管理、连接线程和线程管理

        连接管理模块负责监听MySQL Server的各种请求,根据不同的请求转发到线程管理模块,每个客户请求都会被数据库自动分配一个独立的线程,为其单独服务,而连接县城的主要工作就是负责MySQL Server与客户端通信。线程管理模块主要负责管理这些生成的线程。

        8、转发模块

        客户端连接MySQL后会发送一些查询语句,在MySQL Server里面,连接线程接收到客户端的一个请求后会直接将查询转发到各个对应的处理模块。转发模块主要就是根据查询语句语法分析,然后转发给不同的模块处理。

        9、缓存模块

        查询缓存模块的主要功能是将客户端查询的请求返回的结果集到缓存中与查询的一个HASH值做对应。在查询的基表发生任何数据变化后,MySQL会自动让查询的缓存失效,在读写比例非常高的应用系统中,查询缓存对性能的提高是非常显著的。

        10、优化器模块

        主要将客户端发送的查询请求在之前算法的基础上分析,计算出一个最优的查询策略,优化后会提高查询访问的速度,最后根据其最优策略返回查询语句。

        11、表变更管理模块

        主要负责DML和DDL的查询,例如insert,update,delete,create table,alter table等语句的处理。

        12、表维护模块

        用户检测表的状态、分析、优化表结构以及修复表。

        13、系统状态管理模块

        在客户端请求系统状态的时候,系统状态模块主要负责将各种状态的数据返回给用户。最常用的一些查询状态命令包括:show status,show variables等,都是通过这个模块负责返回的。

        14、表管理器

        主要维护系统生成的表文件。将各个表结构的信息缓存起来,并且还管理表级别的锁。

        15、日志记录模块

        负责庚哥数据库逻辑层的日志文件,包括错误日志、二进制日志以及慢查询日志等。

        16、复制模块

        分为Master和Slave模块两部分。Master模块主要负责复制环境中读取Master端的binary日志以及Slave端的IO线程交互等工作。

        Slave模块主要有两个线程:一个负责从Master请求和接收binary日志,并写入本地IO线程;另一个从relay log读取日志事件,然后解析程可以在Slave端执行的命令,再交给Slave端的SQL线程。

        17、存储引擎接口模块

        MySQL实现了其数据库底层存储引擎的插件式管理,将各种数据处理高度抽象化。

4.MySQL个逻辑块协调工作

        MySQL各逻辑模块协调工作的过程如下图。

        MySQL启动后,初始化模块就从系统配置文件中读取系统参数和命令参数,并按照参数初始化整个系统,同时存储引擎也会启动。当初始化工作结束后,连接管理模块会监听并接收客户端的程序,将连接请求转发给线程管理模块去请求一个连接线程。线程模块接收到请求后调用用户管理模块进行授权检查。通过检查后,会检测线程池里是否有空间连接线程:如果有,就取出跟客户端连接,如果没有,就建立一个新的线程与客户端建立连接。

        MySQL数据库中的请求有两种:一种是需要命令解析和分发模块解析才能执行请求的操作;另一种是不需要转发就可以直接执行的命令。此时,如果初始阶段开启日志功能,日志模块将请求记入日志。

        Query类型的请求会将控制权交给Query解析器。Query解析器会检查是否是select类型的查询,如果是,就启动查询缓存模块。此时会查询缓存中是否已经存在结果集,如果存在,就将缓存中的数据返回给连接线程模块,之后连接线程会将数据传递给客户端。如果没有被缓存,或者不是一个可以缓存的查询,此时查询解析器进行相应的处理,通过查询分发器传给相关的处理模块。

        如果解析器结果是DML/DDL,就交给变更管理模块;如果是一些检查、修复类的查询,就交给表维护模块去处理;如果是一条没有被缓存的查询语句,就交给查询优化器模块。实际上表变更管理器又分为若干小的模块,例如insert处理器,uodate处理器,delete处理器等来负责不同的DML和DDL。总之,查询优化器、表变更模块、表维护模块、复制模块、状态模块都是根据命令解析器的结果不同而分发给不同类型的模块。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geminigoth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值