百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

一文读懂MySQL的架构设计

yuyutoo 2024-11-17 17:54 3 浏览 0 评论

MySQL 是一种流行的开源关系型数据库管理系统,它由四个主要组件构成: 协议接入层计算层,存储引擎层和物理层。

协议接入层

协议接入层是 MySQL 的最上层,它提供了客户端和服务器之间的通信协议。客户端可以使用不同的编程语言(C/Java)和协议(例如,TCP/IP、SSH 或 SSL)来连接到服务器,并发送 SQL 查询和命令。网络连接层还可以提供安全性和身份验证功能,以确保只有授权的用户可以访问数据库。

当客户端发送连接请求时,MySQL服务器会在协议接入层接收请求,分配一个线程来处理该连接,随后进行身份验证。具体的功能如下:

  • 客户端连接的建立与处理:当客户端发起连接请求时,MySQL会创建一个专用的线程(以操作系统级别的线程实现)来为该客户端服务。这些服务线程使用线程池里的长连接服务多个用户请求,减少了线程切换的开销。
  • 安全认证:安全认证是连接层的另一项重要任务。当客户端连接到MySQL服务器时,服务器首先需要验证客户端的身份。MySQL使用基于用户名、主机和密码的认证方式。在连接时,客户端需要提供有效的用户名、主机名和密码,服务器会根据在"mysql.user"表中的数据进行验证,若通过,则建立连接。
  • 连接资源管理:MySQL支持可配置的最大连接数。当到达最大连接数时,新的连接请求会被拒绝。符合条件的客户端可以设置连接超时时间、客户端闲置关闭时间等参数。同时,可以通过"mysql.user"表配置特定用户对于数据库的操作权限。
  • 线程管理:MySQL会自动创建和管理连接线程,其中包括以线程数作为上限的线程池。线程池的目的是复用连接线程,避免了线程切换和创建的开销。此外,MySQL使用异步I/O机制和协程,尽可能提高了并发和吞吐量。

计算层

计算层是 MySQL 的中间层,它主要负责查询解析、查询优化、事务管理和缓存管理。当客户端发送 SQL 查询时,服务层会将其解析为可执行的语句,并尝试优化查询以提高性能。服务层还可以将查询结果缓存在内存中,以便在下一次执行相同查询时能够更快地返回结果。 下图是SQL查询过程:

查询解析

计算层负责从客户端接收来自连接层的SQL查询请求,并进行初始分析、解析和预处理。

  1. 查询缓存(MySQL8.0 中不存在):MySQL会将查询语句和其结果缓存在内存中。当收到一个相同的查询请求时,先检查缓存中是否有匹配的结果。如果有匹配结果,则直接返回,并跳过剩余的处理步骤。如果没有匹配,将继续执行下一个步骤。
  2. SQL解析器:服务层的SQL解析器主要进行语法解析。解析器会根据MySQL词法分析器和语法分析器的解析规则,将查询语句解析成一个字符串表示的树状结构,用于存储语法单位(词素)及它们之间的关系。
  3. SQL预处理:在构建完成解析树后,预处理模块对解析树进行优化和处理。这包括检查权限、完整性约束、函数调用和数据类型等。在预处理阶段,还可能对查询进行改写,例如将"UNION"操作转换为"JOIN"操作,或者将子查询转换为连接操作。

查询优化

查询优化是MySQL执行SQL语句的第三步。SQL语句在查询优化阶段会经历以下步骤:

  • 查询重写:MySQL会对SQL语句进行一些语法和逻辑上的变换,以便于后续的优化和执行。例如,将子查询转换为连接,将or条件转换为union,将in条件转换为exists等。
  • 查询分解:MySQL会将一条复杂的SQL语句分解为多个简单的子查询,每个子查询可以单独优化和执行。例如,将union查询分解为多个select查询,将关联子查询分解为独立的select查询等。
  • 预处理:MySQL会对SQL语句进行一些基本的检查和处理,例如检查语法错误,解析参数,分配内部资源等。
  • 优化器:MySQL会根据统计信息和成本模型,为SQL语句选择一个最佳的执行计划。执行计划包括了连接顺序,访问方法,索引选择,排序策略等。

MySQL优化器在选择执行计划时会考虑以下几个方面:

  • 表依赖关系:MySQL优化器会分析SQL语句中涉及到的表之间是否有依赖关系,比如外键约束,主键约束等。这些依赖关系会影响连接顺序和访问方法的选择。
  • 可用索引:MySQL优化器会分析SQL语句中参与条件过滤或排序的列是否有可用索引,并根据索引类型和覆盖度来选择合适的索引。
  • 预估行数:MySQL优化器会根据数据字典和目录中存储的统计信息来预估每个表或每个索引范围内的行数。这些行数会影响成本模型中的I/O代价和CPU代价。
  • 预估成本:MySQL优化器会根据预估行数和成本常数(cost constant)来预估每个执行计划的成本。成本常数是一些固定参数,比如随机读一页数据的代价,排序一行数据的代价等。MySQL优化器会选择成本最低的执行计划。

事务管理

MySQL的服务层负责事务管理,确保在执行一系列操作时,满足原子性、一致性、隔离性和持久性这四个特性。事务管理涉及的主要功能包括:

  1. 事务隔离级别:MySQL支持四个事务隔离级别:读未提交、读已提交、可重复读和串行化。这些隔离级别分别定义了事务间数据访问的隔离程度,用于防止脏读、不可重复读和幻读。
  2. 锁管理:在事务过程中,可能需要对数据加锁,以确保数据的一致性。MySQL支持的锁类型包括共享锁、排它锁、意向锁、行锁、表锁等。
  3. Undo日志:服务层通过Undo日志实现了事务回滚操作,当事务执行中途出现异常或用户发出回滚请求时,可以通过Undo日志回滚数据到事务开始前的状态。
  4. Redo日志:为了保证事务的持久性,在事务执行过程中,修改的数据首先写入到Redo日志中,再更新到磁盘文件上。在系统恢复过程中,可以通过Redo日志进行数据恢复。

缓存管理

MySQL优化器使用缓存来提高查询速度,包括:

  1. 查询缓存:当相同的SQL查询被多次执行时,可以从查询缓存中直接获取结果,提高性能。由于MySQL 8.0中已移除了查询缓存功能,使用者需要自行实现相关功能,如使用Redis、Memcached等中间缓存系统。
  2. 表缓存:用于存储表的元数据,如表的结构定义。当查询需要表信息时,优先从表缓存中获取,避免磁盘操作。
  3. 线程缓存:用于复用服务器的连接线程。当一个连接关闭后,它的线程会被放回线程缓存池中,供新的连接使用。线程池意味着减少了创建和销毁线程的开销。
  4. 缓冲池:主要用于InnoDB存储引擎,缓冲池管理缓存的数据页,包括数据和索引。当需要访问这些页时,可以直接从缓冲池读取,提高访问速度。

存储引擎层

存储引擎层是 MySQL 的核心组件之一,它负责管理数据的存储索。MySQL 支持多个存储引擎,如 InnoDB、MyISAM、Memory 等。每个存储引擎都有不同的特性和适用场景。MySQL支持多种存储引擎,每种引擎各有特点,根据实际需求进行选用。当然,只要没有非常明确的特殊需求就不需要更改存储引擎,因为InnoDB在大部分场景下都比其他引擎更加适用。引擎层通过标准API与服务层交互,实现数据的存储和查询。

  1. InnoDB:InnoDB是MySQL的默认存储引擎,提供了事务支持、行级锁定、外键约束等功能,适用于需要高并发和数据一致性的OLTP应用程序
  2. MyISAM:MyISAM通常用于只读数据表,适用于简单查询和全文索引。其不支持事务、行级锁等功能,适用于读取密集型应用程序OLAP场景。
  3. Memory:Memory存储引擎支持哈希和B树索引,它将数据存储在内存中,易受到系统断电或宕机等影响,具有较高的写性能但不适用于大规模数据分布。
  4. 其他存储引擎:MySQL还支持如Archive、NDB Cluster等其他存储引擎,它们分别适用于存档表、分布式数据库等不同场景。

我们可以在SQL命令行中执行 show engines; 来查看当前支持的存储引擎:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

InnoDB存储结构

InnoDB是MySQL的默认存储引擎,它支持事务、行级锁、外键、MVCC等特性,提供了高性能和高可靠性的数据存储方案。InnoDB的底层结构主要由两部分组成:内存结构和磁盘结构。

图片来源:https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html

InnoDB的磁盘结构主要包括以下几个部分:

  • 表空间(Tablespace):表空间是InnoDB存储数据和索引的逻辑单位,它由一个或多个文件组成。表空间可以分为系统表空间(System Tablespace),通用表空间(General Tablespace),文件表空间(File-Per-Table Tablespace)和临时表空间(Temporary Tablespace)。
  • 段(Segment):段是表空间中分配和管理空间的单位,它由一个或多个连续或不连续的区(Extent)组成。段可以分为数据段(Data Segment),索引段(Index Segment),回滚段(Rollback Segment),撤销日志段(Undo Log Segment)和系统段(System Segment)。
  • 区(Extent):区是段中分配空间的单位,它由一组连续的页(Page)组成。每个区的大小固定为1MB,包含64个页。
  • 页(Page):页是InnoDB在磁盘和内存之间传输数据的基本单位,它由一个固定大小的块(Block)组成。每个页的大小默认为16KB,可以通过参数innodb_page_size来调整。页可以分为不同的类型,根据存储的内容而定,比如数据页(Data Page),索引页(Index Page),系统页(System Page),事务系统页(Transaction System Page),撤销日志页(Undo Log Page)等。
  • 行(Row):行是InnoDB存储数据记录的最小单位,它由一个或多个列(Column)组成。每个行的大小不能超过半个页。行可以分为两种格式,根据存储方式而定,比如紧凑格式(Compact Format)和动态格式(Dynamic Format)。

物理层

物理层是 MySQL 的最底层,它负责管理数据在硬盘上的存储和检索。MySQL 使用文件系统来存储数据和元数据,例如表结构索引日志文件
物理层还包括数据缓存和磁盘 I/O 管理,以提高数据读取和写入的性能。

需要注意的是, 上图描述的是MySQL5.7及以前的逻辑架构,MySQL8.0中正式移除了查询缓存组件, 因为从收集的数据来看查询缓存的命中率很低,即使是在MySQL5.7中查询缓存这个选项也是默认关闭的。

  • Connectors:指的是不同语言中与SQL的交互Management Serveices & Utilities: 系统管理和控制工具
  • Connection Pool: 连接池。管理缓冲用户连接,线程处理等需要缓存的需求。
  • SQL Interface: SQL接口。接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。
  • Parser:解析器。SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。主要功能:
    • 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
    • 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
  • Optimizer: 查询优化器
  • Cache和Buffer: 查询缓存,不建议使用,后续MYSQL8.0版本已经废弃
  • Engine :存储引擎
  • 相关推荐

    微软Win10/Win11版Copilot上线:支持OpenAI o3推理模型

    IT之家4月3日消息,科技媒体WindowsLatest昨日(4月2日)发布博文,报道称Windows10、Windows11新版Copilot应用已摘掉Beta帽...

    WinForm 双屏幕应用开发:原理、实现与优化

    在当今的软件开发领域,多屏幕显示技术的应用越来越广泛。对于WinForm应用程序来说,能够支持双屏幕显示不仅可以提升用户体验,还能满足一些特定场景下的业务需求,比如在演示、监控或者多任务处理等场景...

    推荐一个使用 C# 开发的 Windows10 磁贴美化小工具

    ...

    OpenJDK 8 安装(openjdk 8 windows)

    通常OpenJDK8和11都能互相编译和通用。我们建议使用11,但是如果你使用JDK8的话也是没有问题的。建议配置使用OpenJDK,不建议使用OracleJDK,主要是因为版...

    基于 Linux 快速部署 OpenConnect VPN 服务(ocserv 实战指南)

    一、前言在如今远程办公和内网穿透需求日益增长的背景下,搭建一套安全、稳定、高效的VPN系统显得尤为重要。OpenConnectServer(ocserv)是一个开源、高性能的VPN服务端软件...

    巧妙设置让Edge浏览器更好用(edge怎么设置好用)

    虽然现在新版本的Edge浏览器已经推出,但是毕竟还处于测试的状态中。而Win10系统里面自带的老版Edge浏览器,却越来越不被人重视。其实我们只需要根据实际情况对老版本的Edge浏览器进行一些简单的设...

    WPF做一个漂亮的登录界面(wpf页面设计)

    ...

    微软开源博客工具Open Live Writer更新:多项Bug修复

    OpenLiveWriter前身是WindowsLiveWriter,是微软WindowsLive系列软件之一,曾经是博主们非常喜爱的一款所见即所得博文编辑工具,支持离线保存,还支持图像编辑...

    基于OpenVINO的在线设计和虚拟试穿 | OPENAIGC大赛企业组优秀作品

    在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。...

    C#开源免费的Windows右键菜单管理工具

    ...

    Windows10或11中隐藏的功能,用它再也不用担心电脑中病毒!

    ...

    Python open函数详解(python open函数源码)

    演示环境,操作系统:Win1021H2(64bit);Python解释器:3.8.10。open是Python的一个内置函数,一般用于本地文件的读写操作。用法如下。my_file=open(fi...

    Windows 11 安装 Docker Desktop(Windows 11 安装助手 Windows 易升 关系)

    ...

    Windows 11 新版发布:屏幕亮度自适应控制,小组件界面重新设计!

    ...

    世界上最好用的Linux发行版之一,OpenSUSE安装及简单体验

    背景之前无意在论坛里看到openSUSE的Linux发行版,被称为世界上最好用的Linux发行版之一(阔怕),一直想体验一下,于是这期做一个安装和简单体验教程吧。...

    取消回复欢迎 发表评论: