iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 整体架构介绍
  • 645
分享到

MySQL 整体架构介绍

MySQL整体架构MySQL整体架构介绍 2022-05-23 22:05:07 645人浏览 独家记忆
摘要

Mysql 在整体架构上分为 Server 层和存储引擎层。其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎层负责数据的存储和提取,如 I

Mysql 在整体架构上分为 Server 层和存储引擎层。其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎层负责数据的存储和提取,如 InnoDB、MyISAM、Memory 等引擎。在客户端连接到 Server 层后,Server 会调用数据引擎提供的接口,进行数据的变更。

连接器

负责和客户端建立连接,获取用户权限以及维持和管理连接。

通过 show processlist; 来查询连接的状态。在用户建立连接后,即使管理员改变连接用户的权限,也不会影响到已连接的用户。默认连接时长为 8 小时,超过时间后将会被断开。

简单说下长连接:

优势:在连接时间内,客户端一直使用同一连接,避免多次连接的资源消耗。

劣势:在 mysql 执行时,使用的内存被连接对象管理,由于长时间没有被释放,会导致系统内存溢出,被系统kill. 所以需要定期断开长连接,或执行大查询后,断开连接。Mysql 5.7 后,可以通过 mysql_rest_connection 初始化连接资源,不需要重连或者做权限验证。

查询缓存

当接受到查询请求时,会现在查询缓存中查询(key/value保存),是否执行过。没有的话,再走正常的执行流程。

但在实际情况下,查询缓存一般没有必要设置。因为在查询涉及到的表被更新时,缓存就会被清空。所以适用于静态表。在 MySQL8.0 后,查询缓存被废除。

分析器

词法分析:

如识别 select,表名,列名,判断其是否存在等。

语法分析:

判断语句是否符合 MySQL 语法。

优化器

确定索引的使用,join 表的连接顺序等,选择最优化的方案。

执行器

在具体执行语句前,会先进行权限的检查,通过后使用数据引擎提供的接口,进行查询。如果设置了慢查询,会在对应日志中看到 rows_examined 来表示扫描的行数。在一些场景下(索引),执行器调用一次,但在数据引擎中扫描了多行,所以引擎扫描的行数和 rows_examined 并不完全相同。

不预先检查权限的原因:如像触发器等情况,需要在执行器阶段才能确定权限,在优化器阶段无法验证。

使用 profiling 查看 SQL 执行过程

打开 profiling 分析语句执行过程:


mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|      0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

执行查询语句:


mysql> SELECT * FROM s limit 10;
+------+--------+-----+-----+
| s_id | s_name | age | sex |
+------+--------+-----+-----+
|  1 | z   | 12 |  1 |
|  2 | s   | 14 |  0 |
|  3 | c   | 14 |  1 |
+------+--------+-----+-----+
3 rows in set (0.00 sec)

获取 profiles;


mysql> show profiles;
+----------+------------+--------------------------+
| Query_ID | Duration  | Query          |
+----------+------------+--------------------------+
|    1 | 0.00046600 | SELECT * FROM s limit 10 |
+----------+------------+--------------------------+

mysql> show profile;
+----------------------+----------+
| Status        | Duration |
+----------------------+----------+
| starting       | 0.000069 |
| checking permissions | 0.000008 | 权限检查
| Opening tables    | 0.000018 | 打开表
| init         | 0.000019 | 初始化
| System lock     | 0.000010 | 系统
| optimizing      | 0.000004 | 优化查询
| statistics      | 0.000013 |
| preparing      | 0.000094 | 准备
| executing      | 0.000016 | 执行
| Sending data     | 0.000120 |
| end         | 0.000010 |
| query end      | 0.000015 |
| closing tables    | 0.000014 |
| freeing items    | 0.000032 |
| cleaning up     | 0.000026 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

查询具体的语句:


mysql> show profile for query 1;
+----------------------+----------+
| Status        | Duration |
+----------------------+----------+
| starting       | 0.000069 |
| checking permissions | 0.000008 |
| Opening tables    | 0.000018 |
| init         | 0.000019 |
| System lock     | 0.000010 |
| optimizing      | 0.000004 |
| statistics      | 0.000013 |
| preparing      | 0.000094 |
| executing      | 0.000016 |
| Sending data     | 0.000120 |
| end         | 0.000010 |
| query end      | 0.000015 |
| closing tables    | 0.000014 |
| freeing items    | 0.000032 |
| cleaning up     | 0.000026 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

MySQL 日志模块

如前面所说,MySQL 整体分为 Server 层和数据引擎层,而每层也对应了自己的日志文件。如果选用的是 InnoDB 引擎,对应的是 redo log 文件。Server 层则对应了 binlog 文件。至于为什么存在了两种日志系统,咱们往下看。

redo log

redo log 是 InnoDB 特有日志,为什么要引入 redo log 呢,想象这样一个场景,MySQL 为了保证持久性是需要把数据写入磁盘文件的。我们知道,在写入磁盘时,会进行文件的 IO,查找操作,如果每次更新操作都这样的话,整体的效率就会特别低,根本没法使用。

既然直接写入磁盘不行,解决方法就是先写进内存,在系统空闲时再更新到磁盘就可以了。但光更新内存不行,假如系统出现异常宕机和重启,内存中没有被写入磁盘的数据就会被丢掉,数据的一致性就出现问题了。这时 redo log 就发挥了作用,在更新操作发生时,InnoDb 会先写入 redo log 日志(记录了数据发生了怎么样的改变),然后更新内存,最后在适当的时间再写入磁盘,一般是找系统空闲的时间做。先写日志,在写磁盘的操作,就是常说到的 WAL (Write-Ahead- Logging)技术。

redo log 的出现,除了在效率上有了很大的改善,还保证了 MySQL 具有了 crash-safe 的能力,在发生异常情况下,不会丢失数据。

在具体实现上 redo log 的大小是固定的,可配置一组为 4 个文件,每个文件 1GB,更新时对四个文件进行循环写入。

write pos 记录当前写入的位置,写完就后移,当第写入第 4 个文件的末尾时,从第 0 号位置重新写入。

check point 表示当前可以擦除的位置,当数据更新到磁盘时,check point 就向后移动。

write pos 和 check point 之间的位置,就是可以记录更新操作的空间。当 write pos 追上 check point ,不在能执行新的操作,先让 check point 去写入一些数据。

可以将 innodb_flush_log_at_trx_commit 设置成 1,开启 redo log 持久化的能力。

binlog

binlog 则是 Server 层的日志,主要用于归档,在备份,主备同步,恢复数据时发挥作用,常见的日志格式有 row, mixed, statement 三种。具体的使用方法可以参见 Binlog 恢复日志这篇。

可以通过 sync_binlog=1 开启 binlog 写入磁盘。

这里对 binlog 和 redo 进行下区分:

  1. 所有者不同,binlog 是 Server 层,所有引擎都可使用。redo log 是 InnoDB 特有的。
  2. 类型不同,binlog 是逻辑日志,记录的是语句的原始逻辑(比 statement)。redo log 是物理日志,记录某个数据页被做了怎样的修改。
  3. 数据写入的方式不同,binog 日志会一直追加,而 redo log 是循环写入。
  4. 功能不同,binlog 用于归档,而 redo log 用于保证 crash-safe.

两阶段提交

下面执行器和 InnoDB 执行 Update 时内部流程:

以更新 update T set c=c+1 where ID=2; 语句为例:

  1. 执行器通过 InooDB 引擎去 ID 所在行,ID 为主键。引擎通过树搜索找到该行,如果该行所在数据页在内存中,返回给执行器。否则先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的数据,将 C 值加 1,等到新的一行,然后通过引擎接口重新写入新数据。
  3. 引擎将该行更新到内存中,同时将该更新操作记录到 redo log 中,并更改 redo log 的状态为 prepare 状态。然后告知执行器,在合适的时间提交事务
  4. 执行器生成这个操作的 binlog,并将 binlog 写入磁盘。
  5. 执行器调用引擎到的提交事务接口,将刚刚写入的 redo log 改成 commit 状态,更新完成。

浅色为执行器执行,深色为引擎执行。

在更新内存后,将写入 redo log 拆分了成两个步骤:prepare 和 commit,就是常说的两阶段提交。用于保证当有意外情况发生时,数据的一致性。

这里假设下,如果不采用两阶段提交会发生什么?

  1. 先写 redo log 后写 binlog. 假设在写入 redo log 后,MySQL 发生异常重启,此时 binlog 没有写入。在重启后,由于 redolog 已经写入,此时数据库的内容是没有问题的。但此时,如果想要拿 binlog 进行备份或恢复,发现会少了最后一条的更新逻辑,导致数据不一致。
  2. 先写 binlog 后写 redo log. binlog 写入后,MySQL 异常重启,redo log 没有写入。此时重启后,发现 redo log 没有成功写入,认为这个事务无效,而此时 binlog 却多了一条更新语句,拿去恢复后自然数据也是不一致的。

再分析下两阶段提交的过程:

在写 redo log prepare 阶段奔溃,时刻 A 的位置。重启后,发现 redo log 没写入,回滚此次事务。

如果在写 binlog 时奔溃,重启后,发现 binlog 未被写入,回滚操作。

binlog 写完,但在提交 redo log 的 commit 状态时发生 crash

  • 如果 redo log 中事务完整,有了 commit 标识,直接提交。
  • 如果 redo log 中只有完整的 prepare, 判断对应 binlog 是否完整。

完整,提交事务
不完整,回滚事务。


如何判断 binlog 是否完整?

  • statement 格式 binlog,会有 COMMIT; 标识
  • row 格式的 binlog,会有 XID event. 标识
  • 在 5.6 后,还有 binlog-checksum 参数,验证 binlog 正确性。

如何将 redo log 和 binlog 关联表示同一个操作?

结构中有一个共同的数据字段,XID. 在崩溃恢复时,会按顺序扫描 redo log:

  • 如果有 prepare,又有 commit 的 redo log,直接提交。
  • 如果只有 prepare,没有 commit 的 redo log, 拿 XID 去 binlog 找对应的事务做判断。

数据写入后,最终落盘和 redo log 有无关系?

  • 对于正常运行的 instance 来说,内存中页被修改后,和磁盘的数据页不一致,称为脏页。而落盘的过程,是把内存中的数据页写入磁盘。
  • 对于 crash 场景,InnoDB 判断一个数据页是否丢失了更新,会将其读到内存,然后让 redo log 更新内存内容。更新完成后,内存页就变成脏页,然后回到第一种情况的状态。

redo log buffer 和 redo log 的关系?

在一个事务的更新过程中,存在多个 SQL 语句,所以是要写多次日志的。
但在写的过程中,生产的日志要先保存起来,但在 commit 前,不能直接写到 redo log 中。
所以通过内存中 redo log buffer 先存 redo log 的日志。在 commit 时,将 buffer 中的内容写入 redo log.

总结

在文章开始部分,说明了 MySQL 的整体架构分为 Server 层和引擎层,并简要说明了一条语句的执行过程。接着 MySQL 在 5.5 后选用 InnoDB 作为默认的引擎,就是因为比原生的 MyISAM 多了事务以及 crash-safe 的能力。

而 crash-safe 就是由 redo log 实现的。与 redo log 类似的日志文件还有 binlog,是 Server 引擎的日志,用于归档和备份数据。

最后提到了,为了保证数据的一致性,将 redo log 和 binlog 放入相同的事务中,也就是常提到的两阶段提交操作。

以上就是MySQL 整体架构介绍的详细内容,更多关于MySQL 整体架构的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 整体架构介绍

本文链接: https://www.lsjlt.com/news/9855.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TiDB整体架构介绍
    TiDB架构图如下 TiDB 集群主要分为三个组件: TiDB Server TiDB Server 负责接收 SQL 请求,处...
    99+
    2024-04-02
  • MySQL整体架构与内存结构
    一  mysql 整体框架: MySQL是由SQL接口,解析器,优化器,缓存,存储引擎等组成的。   1. Connectors指的是不同语言中与SQL的交...
    99+
    2024-04-02
  • mysql 体系结构和存储引擎介绍
    目录1 前言2 mysql 配置文件加载顺序3 mysql 引擎介绍3.1 InnoDB 引擎3.2 MyISAM 引擎3.3 NDB 引擎3.4 Archive 引擎3.5 Fed...
    99+
    2024-04-02
  • Docker镜像多架构构建介绍
    前言: 目前arm系统越来越常见,对镜像的多架构需求也越来越大。对于同一个镜像,最简单的办法就是在amd64或arm机器上build后通过不同的tag进行区分,比如 nginx:v1...
    99+
    2024-04-02
  • Orchard架构的简单介绍
    这篇文章主要讲解了“Orchard架构的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Orchard架构的简单介绍”吧!  对于我们来说,更重要的是...
    99+
    2024-04-02
  • HBase整体架构是什么
    小编给大家分享一下HBase整体架构是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!HBase 系统架构图组成部件说明   Client: ...
    99+
    2023-06-03
  • C++引用和结构体介绍
    目录文章转自微信公众号:Coder梁(ID:Coder_LT) 结构体是我们自定义的复合类型,本质上也是一种变量类型,所以一样可以使用引用。传递结构体引用的方式和其他变量一样: ...
    99+
    2024-04-02
  • C语言struct结构体介绍
    目录structstruct的嵌套实验struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 下面是st...
    99+
    2024-04-02
  • PPython的原理和架构介绍
    本篇内容主要讲解“PPython的原理和架构介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PPython的原理和架构介绍”吧!介绍Python 与 PHP 都是广泛使用的语言,各有所长,让人...
    99+
    2023-06-16
  • MySQL的体系架构
    文章目录 前言MySQL的Server层MySQL的存储引擎1)InnoDB 存储引擎2)MyISAM 存储引擎3)Memory 存储引擎 前言 在学习一种事务之前,我们需要先了解事物的基本组成结构,清楚了事物的基本组成结...
    99+
    2023-08-16
    mysql 架构 adb
  • spring cloud架构整合-springcloud简介
    Spring Cloud是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud...
    99+
    2023-06-05
  • Docker整体架构是怎样的
    这篇文章主要讲解了“Docker整体架构是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker整体架构是怎样的”吧!用户是使用DockerClient与Docker Daemon...
    99+
    2023-06-04
  • Dubbo架构整体设计详解
    目录一、Dubbo调用关系说明1.1 组成部分1.2 启动和执行流程说明二、整体调用链路三、Dubbo整体设计一、Dubbo调用关系说明 1.1 组成部分 在这里主要由四部分组成:...
    99+
    2023-05-15
    Java Dubbo架构整体设计 Dubbo架构整体设计 Java Dubbo
  • Rootless容器背景与架构介绍
    本篇内容介绍了“Rootless容器背景与架构介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Rootless容器背景与架构Docker和...
    99+
    2023-06-19
  • Cable--新虚拟网络架构介绍
    女主宣言本文主要介绍为了统一管理不同编排系统的网络模块,简化虚拟网络功能的开发流程,虚拟网络工作组实现的新虚拟网络架构--Cable。前言OpenStack架构中,Neutron作为虚拟网络模块,管理虚机的网络。随着容器技术的发展,越来越多...
    99+
    2023-06-03
  • SpringMVC RESTFul及REST架构风格介绍
    目录一、RESTful 简介二、RESTful 的实现实践一下1. get 和 post 请求2. put 和 delete 请求一、RESTful 简介 REST 是一种软件架构风...
    99+
    2024-04-02
  • EntityFramework系统架构与原理介绍
    一、Entity Framework概要 Entity Framework是微软的Object Relational Mapper(对象关系映射),也就是我们平常说的ORM,它可以让...
    99+
    2024-04-02
  • go micro整体架构是怎样的
    这篇文章主要讲解了“go micro整体架构是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go micro整体架构是怎样的”吧!   微服务化项目...
    99+
    2024-04-02
  • Web技术整体架构是什么
    本篇内容介绍了“Web技术整体架构是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 开始的开始,就是...
    99+
    2024-04-02
  • LevelDB的整体架构是怎样的
    本文小编为大家详细介绍“LevelDB的整体架构是怎样的”,内容详细,步骤清晰,细节处理妥当,希望这篇“LevelDB的整体架构是怎样的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作