看了这一篇文章,你还不懂MySQL体系结构,你来找我

news2024/11/25 22:35:16

前言

工作很长时间了,对于数据库的掌握程度却仅仅停留在表面的CRUD阶段,对于深层次的原理和技术知识了解的少之又少,随着岁数不断的增长。很多时候,出去找工作很迷茫,被面试官问的感觉自己很菜。现在利用工作休息时间,把自己现有的资料和新学的知识进行总结。也算是一种深层次的理解和掌握。本文章收录在MySQL性能优化+原理+实战专栏,更多的MySQL优化点击此处查看开篇介绍。
在以后的学习中,我会创建一个没有权限的用户,进行MySQL权限和优化的实战。
关于有些系统变量的作用及在学习中遇见的ERROR会全部会收录到开篇介绍一文当中。

在这里插入图片描述
在学习MySQL优化的时候,我们需要大致了解MySQL的体系架构,网上看了很多资料,大致总结了一下,如图在这里插入图片描述

我们可以明确的看出MySQL的最上层是连接器,下面有连接池、系统管理和控制工具、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。大致可以分为网络连接层、数据库服务层、存储引擎层和系统文件层四大部分。接下来,我们就来简单说说每个部分的组成信息

目录

  • 一、网络连接层
  • 二、数据库服务层
    • 2.1 连接池
    • 2.2 SQL接口
    • 2.3 解析器
    • 2.4 查询优化器
    • 2.5 缓存
    • 2.6系统管理和控制工具
  • 三、存储引擎层
  • 四、系统文件层
    • 4.1 日志文件
    • 4.2 数据文件
    • 4.3 配置文件
    • 4.4 pid文件
    • 4.5 socket文件
  • 小结

一、网络连接层

位于整个MySQL体系架构的最上层,主要担任客户端连接器的角色。提供与MySQL服务器建立连接的能力,几乎支持所有主流的服务端语言。例如:Java、C、C++、Python等,各语言都是通过各自的API接口与MySQL建立连接

二、数据库服务层

数据库服务层是整个数据库服务器的核心,主要包括了连接池、SQL接口、解析器、查询优化器、缓存和系统管理和控制工具等部分。

2.1 连接池

多个线程都会去获取一个数据库连接来访问数据库。不能每次都创建一个新的数据库连接,用完然后销毁,这样效率非常低下,因此客户端需要一个数据库连接池,每次从连接池里拿一个连接来处理SQL请求,用完之后又放回连接池中,避免频繁创建销毁数据库连接,从而得知连接池的作用主要负责存储和管理客户端与数据库的连接信息

连接完成后,如果没有后续的动作,这个连接就处于空闲状态。客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数wait_timeout 控制的,默认值是 8 小时

mysql> create user 'mutlis'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.02 sec)

[root@mysql2 bin]# mysql -umutlis -p123456
Server version: 8.0.32 MySQL Community Server - GPL
## 忽略部分登陆代码 ##
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set persist wait_timeout=28800;
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation

##使用管理员授予我们当前用户SYSTEM_VARIABLES_ADMIN(启用修改或保留全局系统变量权限)后继续修改 ##
mysql> set persist wait_timeout=100;
mysql> show variables like 'wait_timeout%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

吃惊了吧,设置了wait_timeout 不起作用,原因是wait_timeout参数:

  • 对于非交互式连接,类似于jdbc连接wait_timeout的值继承自服务器端全局变量wait_timeout。
  • 对于交互式连接,类似于mysql客户端连接wait_timeout的值继承自服务器端全局变量interactive_timeout。

我们使用的是交互式连接,所以当前wait_timeout是由全局变量interactive_timeout决定。

mysql> set persist interactive_timeout=20;
Query OK, 0 rows affected (0.01 sec)

## 退出数据库后重新登陆查询 ##
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 20   |
+---------------+-------+
1 row in set (0.00 sec)

判断一个连接的空闲时间,可通过show processlist & show full processlist & information_schema.processlist等查询Sleep状态的时间

  • full的区别是:如果你不使用FULL关键词,则只显示每个查询的前100个字符
  • 如果您有SUPER权限,您可以看到所有线程,否则只能看到自己的线程。
mysql> show processlist;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time | State                  | Info             |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
|  5 | event_scheduler | localhost | NULL | Daemon  | 3625 | Waiting on empty queue | NULL             |
| 12 | root            | localhost | NULL | Query   |    0 | init                   | show processlist |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
2 rows in set (0.00 sec)

重新登陆我们刚才创建的用户,等待20S后

mysql> select current_user();
ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.
No connection. Trying to reconnect...
Connection id:    183
Current database: *** NONE ***

+------------------+
| current_user()   |
+------------------+
| mutlis@localhost |
+------------------+
1 row in set (0.00 sec)

客户端由于不活动而被服务器断开连接。所以在这里,我们可以根据Sleep的时长和数量进行调整,缓解服务器的压力,一般默认值即可。

2.2 SQL接口

我们使用客户端连接数据库,使用 select * from mysql.user查询数据的时候,而SQL接口它就负责接收客户端发送过来的各种SQL语句,并将SQL语句发送到其他部分,并接收其他部分返回的结果数据,将结果数据返回给客户端。

2.3 解析器

主要负责对请求的SQL解析成一棵“解析树”,然后根据MySQL中的一些规则对“解析树”做进一步的语法验证,确认其是否合法

2.4 查询优化器

“解析树”通过了解析器的语法检查,此时就会由优化器将其转化为执行计划并对查询语句进行优化,它使用的是“选择-投影-连接”策略进行查询(点击此处了解选择-投影-连接原理)然后与存储引擎进行交互

2.5 缓存

MySQL的缓存是由一系列的小缓存组成的。例如:MySQL的表缓存,记录缓存,MySQL中的权限缓存,引擎缓存等。MySQL中的缓存能够提高数据的查询性能,如果查询的结果能够命中缓存,则MySQL会直接返回缓存中的结果信息。但是查询缓存已经在8.0版本中删除

2.6系统管理和控制工具

提供数据库系统的管理和控制功能,例如对数据库中的数据进行备份和恢复,保证整个数据库的安全性,提供安全管理,对整个数据库的集群进行协调和管理等。

三、存储引擎层

MySQL中的存储引擎层主要负责数据的写入和读取,与底层的文件进行交互。值得一提的是,MySQL中的存储引擎是插件式的,服务器中的查询执行引擎通过相关的接口与存储引擎进行通信,同时,接口屏蔽了不同存储引擎之间的差异。MySQL中,最常用的存储引擎就是InnoDBMyISAM

InnoDB和MyISAM存储引擎需要我们重点点掌握,也是以后我们成为架构师必知必会的内容,后面文章中详细讲解。

四、系统文件层

系统文件层主要包括MySQL中存储数据的底层文件,与上层的存储引擎进行交互,是文件的物理存储层。其存储的文件主要有:日志文件、数据文件、配置文件、MySQL的进行pid文件和socket文件等。

4.1 日志文件

  • Error log错误日志: 记录遇到的所有严重的错误信息,每次启动关闭的信息信息;

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

  • Query log 查询日志: 记录所有查询操作,体积较大,开启后对性能有影响。

  • Slow Query log 慢查询日志: 记录所有执行时间超过long_query_time的SQL语句和达到min_examined_row_limit条距离的语句。

  • InnoDB redo log: 记录InnoDB所做的物理变更和事务信息。
    中继日志:只从复制产生,用户slave机读取,复制master机的SQL操作

后面都会详细讲解。

4.2 数据文件

数据文件中主要包括了:db.opt文件、frm文件、MYD文件、MYI文件、ibd文件、ibdata文件、ibdata1文件、ib_logfile0和ib_logfile1文件等。

  • db.opt文件: 主要记录当前数据库使用的字符集和检验规则等信息。
  • frm文件: 存储数据表的结构信息,主要是数据表相关的元数据信息,包括数据表的表结构定义信息,每张表都会有一个frm文件。值得注意的是:MySQL8版本中的innodb存储引擎的表没有frm文件。而是合并在b.ibd文件中
  • MYD文件: MyISAM存储引擎专用的文件格式,主要存放MyISAM存储引擎数据表中的数据,每张MyISAM存储引擎表对应一个.MYD文件。
  • MYI文件: MyISAM存储引擎专用的文件格式,主要存放与MyISAM存储引擎数据表相关的索引信息,每张MyISAM存储引擎表对应一个.MYI文件。
  • ibd文件: 存放Innodb存储引擎的数据文件和索引文件,主要存放的是独享表空间的数据和索引,每张表对应一个.ibd文件。
    ibdata文件 存放Innodb存储引擎的数据文件和索引文件,主要存放的是共享表空间的数据和索引,所有表共用一个(或者多个).ibdata文件,可以根据配置来指定共用的.ibdata文件个数。
  • ibdata1文件: MySQL的系统表空间数据文件,主要存储MySQL的数据表元数据、Undo日志等信息。
  • ib_logfile0和ib_logfile1文件: MySQL数据库中的Redo log文件,主要用于MySQL实现事务的持久性。如果在某个时间点MySQL发生了故障,此时如果有脏页没有写入到数据库的ibd文件中,在重启MySQL的时候,MySQL会根据Redo Log信息进行重做,将写入Redo Log并且尚未写入数据表的数据进行持久化操作。

4.3 配置文件

用于存在MySQL所有的配置信息,在Unix/Linux环境中是my.cnf文件,在Windows环境中是my.ini文件。

4.4 pid文件

存放MySQL进程运行时的进程号的文件,主要存在于Unix/Linux环境中,具体的存储目录可以在my.cnf或者my.ini文件中进行配置。

4.5 socket文件

socket文件和pid文件一样,都是MySQL在Unix/Linux环境中运行才会有的文件。在Unix/Linux环境中,客户端可以直接通过socket来连接MySQL

小结

MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。mysql执行查询的过程如下

在这里插入图片描述
客户端先发送查询语句给服务器,进行sql解析,生成解析树,再预处理,生成第二个解析树,最后经过优化器,生成真正的执行计划根据执行计划,调用存储引擎的API来执行查询将结果返回给客户端。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/461002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序第五节——登录那些事儿(超详细的前后端完整流程)

📌 微信小程序第一节 ——自定义顶部、底部导航栏以及获取胶囊体位置信息。 📌 微信小程序第二节 —— 自定义组件 📌 微信小程序第三节 —— 页面跳转的那些事儿 📌 微信小程序第四节—— 网络请求那些事儿 😜作 …

人工智能时代背景下,如何发展与应用自动化测试?

人工智能时代为自动化测试提供了机会和挑战。在发展自动化测试方面,是人工智能领域下的一个应用方向,和无人驾驶、机器人等一样,都是AI技术的应用场景。从技术的发展角度看,自动化测试一共经历了四代发展变化。从最早提出自动化测…

关于 变量

关于局部变量和静态变量&#xff08;基于有一定指针基础&#xff09; #include<stdio.h> void aaa() {int n10;} int main() {printf("%d",n);return 0; } 在这个代码里&#xff0c;很明显会报错&#xff0c;未定义该n标识符&#xff0c;因为这个n是局部变量…

在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?

粉丝提问&#xff1a; 彭老师&#xff0c;问下&#xff0c;在程序里面执行system(“cd /某个目录”)&#xff0c;这样会切换不成功&#xff0c;为啥呢 实例代码&#xff1a; 粉丝的疑惑是明明第10行执行了cd /media操作&#xff0c; 为什么12行执行的pwd > test2.txt 结…

Unity InputField滑动条

InputField增加滑动条效果 类似图中效果 添加一个InputField组件 2 .添加一个Scrollbar放在InputField内 调整属性 调整InputFiled组件属性 需要将Scrollbal添加到InputField的scrollbar上 然后根据美术需求将位置进行调整&#xff0c;记得InputFiled下的Text不要被Scr…

【浓缩概率】浓缩概率思想帮我蒙选择题的概率大大提升!

今天在学习的时候遇到一个很有趣的思想叫作浓缩概率&#xff0c;可以帮我们快速解决一下概率悖论问题&#xff01; 什么是概率 计算概率有下面两个最简单的原则&#xff1a; 原则一、计算概率一定要有一个参照系&#xff0c;称作「样本空间」&#xff0c;即随机事件可能出现…

Docker容器--Consul部署

Docker容器--Consul部署 一、简介1、概述2、Consul两种模式 二、Consul特性1、特性2、应用场景 三、部署Consul集群&#xff08;Server端&#xff09;1、建立Consul服务2、设置代理&#xff0c;在后台启动consul服务端3、查看集群信息 四、Consul部署&#xff08;Client端&…

第4章:运算符

1.算术运算符 ① SELECT 10010,100-35.5,100*2,100/2,100%30 FROM DUAL;②在sql中“”没有连接作用&#xff0c;表示加法运算&#xff0c;字符串转换为数值&#xff08;隐式转换&#xff09;。非数值看作0处理 SELECT 1001 1 FROM DUAL;SELECT 100 a FROM DUAL;③加法运算…

Trie Tree(字典树)例题

字典树. 又称单词查找树&#xff0c; Trie树 &#xff0c;是一种 树形结构 &#xff0c;是一种哈希树的变种。经常被搜索引擎系统用于文本词频统计。. 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最大限度地减少无谓的字符串比较&#xff0c;查询效…

Python 使用chatGPT帮忙写一个有序集类 OrderedSet

需求:需要实现一个有序的集合&#xff0c;像python普通集合一样&#xff0c;除了 它是有序的 我这边穿插着使用了gpt3.5和gpt4,发现确实还是gpt4好用&#xff0c;一分钱一分货啊 问&#xff1a;我的要求是这样&#xff0c;data是一个集合&#xff0c;往里面放了2&#xff0c;…

【大厂面试问题】:飞机绕行地球问题

你的阅读是我最大的动力 目录 你的阅读是我最大的动力 问题描述&#xff1a; 引出思路&#xff1a; 一台加油飞机 两台加油飞机 返航方案一&#xff1a;加油机I、II同时起飞。 返航方案二&#xff1a;加油机I先起飞加油机II再起飞 答案 不直接说答案&#xff0c;一步一…

14个WooCommerce商城网站必备插件

开始建立 WooCommerce 网站&#xff1f;您需要一个具有许多有助于吸引和留住客户的有用功能的网站。虽然基本的 WooCommerce 设置非常方便&#xff0c;但您可以通过使用有用的插件扩展 WooCommerce 来做更多的事情。 有数百个插件需要考虑&#xff0c;我们已经完成了研究&…

[C++初阶]栈和队列_优先级队列的模拟实现 deque类 的理解

为了更好的理解优先级队列priority_queue&#xff0c;这里会同时进行栈和队列的提及 文章目录 简要概念&#xff08;栈和队列&#xff09;栈和队列的模拟实现与使用stack&#xff08;栈&#xff09;deque的理解和操作queue priority_queue&#xff08;优先级队列&#xff09;框…

悲观锁、乐观锁、自旋锁和读写锁

悲观锁和乐观锁 悲观锁&#xff1a;在每次取数据时&#xff0c;总是担心数据会被其他线程修改&#xff0c;所以会在取数据前先加锁&#xff08;读锁&#xff0c;写锁&#xff0c;行 锁等&#xff09;&#xff0c;当其他线程想要访问数据时&#xff0c;被阻塞挂起。&#xff08…

金融贷款行业如何高效获客,积累意向客户群体——运营商大数据

现如今贷款行业面对的运营压力日益扩大&#xff0c;顾客贮备是生存的关键&#xff0c;传统式的陌生拜访&#xff0c;一切随缘销售市场已不能满足其要求。互联网消费行为的融合与转变是在销售市场端反映&#xff0c;直接影响着广告推广广告策略的确立与运用。 可是&#xff0c;…

移除元素【数组】

⭐前言⭐ ※※※大家好&#xff01;我是同学〖森〗&#xff0c;一名计算机爱好者&#xff0c;今天让我们进入练习模式。若有错误&#xff0c;请多多指教。更多有趣的代码请移步Gitee &#x1f44d; 点赞 ⭐ 收藏 &#x1f4dd;留言 都是我创作的最大的动力&#xff01; 题目 27…

IPEmotion 2023 R1支持在线能量分析

新发布的IPEmotion 2023 R1提供了许多新功能&#xff0c;其中最重要的是新的“在线功率计算&#xff08;Online Power Calculation&#xff09;”功能。该功能允许使用预定义的功率计算来进行测量任务和数据分析。此外&#xff0c;IPEmotion 2023 R1现在支持一种新的存储模式&a…

Maya英文界面怎么改为中文界面

Maya是一款3D动画和视觉效果软件&#xff0c;用于创建逼真的角色和大片般的效果&#xff0c;也是受到电影、电视和游戏行业的 3D 建模师、动画师、照明艺术家和 VFX 艺术家等多数人喜爱的一款3D软件。我们在使用Maya的过程中&#xff0c;常常会遇到一些小阻碍&#xff0c;比如M…

【Python爬虫实战】你不必到处找数据,你完全可以自己爬之Python批量采集图虫网摄影师高清美照,听说~你喜欢御姐...(爬图神器)

前言 怎么批量保存网页图片&#xff1f; 有时候在网页中看到很多美图其中有很多自己喜欢的图片素材或壁纸&#xff0c;一张纸一张下载保存未 免太低效了。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众ha…

C++哈希应用——位图布隆过滤器

C布隆过滤器 文章目录 C布隆过滤器概念实质用途控制误判率实现插入和查找布隆过滤器的删除 布隆过滤器优点布隆过滤器缺陷相关大数据题目 用哈希表存储用户记录&#xff0c;缺点是需要消耗较大的内存&#xff1b;用位图存储用户记录&#xff0c;缺点是位图一般处理整形&#xf…