一图搞定MySQL体系架构

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 要了解mysql的运行机制,那么首先要对mysql的体系结构有一定的了解。

mysql体系结构


11.png


由图,可以看出MySQL由一下几部分组成:


连接池组件

管理服务和工具组件

SQL接口组件

查询分析器组件

优化器组件

缓冲(Cache)组件

插件式存储引擎

物理文件

说明:

MySql数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。

需要注意:

存储引擎是基于表的,而不是基于数据库。


基于这样的特性,针对在项目中的业务数据库,大部分由于需要支持事务属性,所以采用的使用InnoDB存储引擎。但是针对那些只读特性的表,我们可以考虑使用MyISAM存储引擎,这样并不会破坏数据库的事务特性。


详细说明


最上层是连接组件。下面服务器是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。


连接池:由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。

管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql复制、集群等

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

查询解析器: SQL命令传递到解析器的时候会被解析器验证和解析(权限、语法结构)

主要功能:

a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的

b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

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

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

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

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

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


此外查询优化器还能控制一个sql语句查询具体走哪一个索引,自动调整sql语句中where条件的顺序,来满足复合索引最左匹配原则的规则。


缓存器: 查询缓存(MySQL 8.0 版本后移除),如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。

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


MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。

所以,一般在大多数情况下我们都是不推荐去使用查询缓存的。

MySQL 8.0 版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。


插入式存储引擎 :存储引擎说白了就是如何管理操作数据(存储数据、如何更新、查询数据等)的一种方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)


物理文件:

物理文件包括:日志文件,数据文件,配置文件,pid文件,socket文件等


一个查询语句的执行流程


说了以上这么多,那么究竟一条 sql 语句是如何执行的呢?其实我们的 sql 可以分为两种,一种是查询,一种是更新(增加,更新,删除)。我们先分析下查询语句,语句如下:


select * from tb_student  A where A.age='18' and A.name=' 张三 ';

结合上面的说明,我们分析下这个语句的执行流程:

1、建立连接

2、调用sql接口

3、鉴权:先检查该语句是否有权限,如果没有权限,直接返回错误信息

4、缓存判断:如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 sql 语句为 key 在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。

5、解析sql语句:

通过分析器进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select,提取需要查询的表名为 tb_student,需要查询所有的列,查询条件是这个表的 id=‘1’。然后判断这个 sql 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。

6、查询优化对sql语句进行sql

接下来就是优化器进行确定执行方案,上面的 sql 语句,可以有两种执行方案:

a. 先查询学生表中姓名为“张三”的学生,然后判断是否年龄是 18。

b. 先找出学生中年龄 18 岁的学生,然后再查询姓名为“张三”的学生。

那么优化器根据自己的优化算法进行选择执行效率最好的一个方案(优化器认为,有时候不一定最好)。确认了执行计划后就准备开始执行了。


7、执行查询,返回结果


物理文件说明


1、日志文件

10.png

error log 错误日志 排错 /var/log/mysqld.log【默认开启】

bin log 二进制日志 备份 增量备份 DDL DML DCL

Relay log 中继日志 复制 接收 replication master

slow log 慢查询日志 调优 查询时间超过指定值


日志文件的默认位置:

Error Log
log-error=/var/log/mysqld.log
Binary Log
log-bin=/var/log/mysql-bin/bin.log

server-id=2 5.7.x版本后

Slow Query Log
slow_query_log=1|0
slow_query_log_file=/var/log/mysql-slow/slow.log
long_query_time=3

2、配置文件

/etc/my.cnf—>/etc/mysql/my.cnf—>/usr/etc/my.cnf—> ~/.my.cnf

如果冲突,以最后一个读取的为准

[mysqld]组中包括了mysqld服务启动时的初始化参数

[client]组中包含着客户端工具程序可以读取的参数,此外还有其他针对各个客户端软件的特定参数组等


3、数据文件

1、.frm文件

不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等。

2、.MYD文件

myisam存储引擎专用,存放myisam表的数据(data)。每一个myisam表都会有一个.MYD文件与之呼应,同样存放在所属数据库的目录下

3、.MYI文件

也是myisam存储引擎专用,存放myisam表的索引相关信息。对于myisam存储引擎来说,可以被缓存(cache)的内容主要就是来源于.MYI文件中。

每一个myisam表对应一个.MYI文件,其存放的位置和.frm及.MYD一样

4、.ibd文件和ibdata文件

存放innoDB的数据文件(包括索引)。innoDB存储引擎有两种表空间方式:独享表空间和共享表空间。

独享表空间:使用.ibd文件来存放数据,且每个表一个.ibd文件,文件存放在和myisam数据相同的位置。

共享表空间:使用.ibdata文件,所有表共同使用一个(或多个,自行配置)ibdata文件。


ibdata1:系统表空间(数据文件)undo 段

ib_logfile0 redlog文件 一组

ib_logfile1


db.opt文件 此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规。


4、pid文件

pid文件是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,它存放着自己的进程id


5、socket文件

socket文件也是在Unix/Linux环境下才有的,用户在Unix/Linux环境下客户端连接可以不通过TCP/IP网络而直接使用Unix Socket来连接mysql.


区分数据库、数据库实例、数据库服务器


数据库(database):

操作系统或存储上的数据文件的集合。mysql数据库中,数据库文件可以是* .frm、.MYD、.MYI、*.ibd等结尾的文件,不同存储引擎文件类型不同。

更偏向文件的存储方面。

数据库实例(instance)

由后台进程或者线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。

需要注意:数据库实例才是真正操作数据库的。

更偏向应用操作方面。


数据库和数据库实例的关系:

通常情况下,数据库实例和数据库是一一对应的关系,也就是一个数据库实例对应一个数据库;

但是,在集群环境中存在多个数据库实例共同使用一个数据库。

比如一个数据库里面的表,经过分表策略,可以分散在多个数据库实例中。


数据库实例指的是数据库应用,数据库指的是在数据库实例上面创建的database。

比如在服务器上部署了一个3306端口的mysql应用,那么就是一个数据库实例;

如果继续部署一个3309的mysql应用,那么就是在一个服务上部署了2个msql的实例。

在3306端口的mysql实例上,创建一个名为order的database,就是创建了一个数据库。


数据库服务器(database server)

部署安装数据库实例的服务器。


总结


1、mysql体系结构,主要包括连接池组件、管理服务和工具组件

SQL接口组件、查询分析器组件、优化器组件、缓冲(Cache)组件、插件式存储引擎

物理文件。

2、分析一个查询语句的执行过程:建立连接—》权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎

3、区分数据库、数据库实例、数据库服务器

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
监控 数据可视化 关系型数据库
微服务架构+Java+Spring Cloud +UniApp +MySql智慧工地系统源码
项目管理:项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。
307 6
|
2月前
|
SQL 存储 缓存
MySQL - 一文了解MySQL的基础架构及各个组件的作用
MySQL - 一文了解MySQL的基础架构及各个组件的作用
|
27天前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
76 0
|
1月前
|
架构师 算法 关系型数据库
数据库架构师之道:MySQL安装与系统整合指南
数据库架构师之道:MySQL安装与系统整合指南
45 0
|
2月前
|
存储 监控 关系型数据库
ELK架构监控MySQL慢日志
ELK架构监控MySQL慢日志
|
2月前
|
SQL 缓存 关系型数据库
从架构师角度全局理解Mysql性能优化
从架构师角度全局理解Mysql性能优化
|
2月前
|
SQL 存储 缓存
【MySQL】一文了解MySQL的基础架构及各个组件的作用
不管是开运、运维、测试,都或多或少的要接触MySQL,了解MySQL的基础架构及各个组件之间的关系,有助于我们更加深入的理解MySQL
338 6
【MySQL】一文了解MySQL的基础架构及各个组件的作用
|
2月前
|
SQL 缓存 关系型数据库
MySQL(终结篇一)- 性能优化(配置及架构)
MySQL(终结篇一)- 性能优化(配置及架构)
599 0
|
4天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
17天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
23 0