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

一文读懂MySQL的架构设计

yuyutoo 2024-11-17 17:54 1 浏览 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 :存储引擎
  • 相关推荐

    mysql数据库如何快速获得库中无主键的表

    概述总结一下MySQL数据库查看无主键表的一些sql,一起来看看吧~1、查看表主键信息--查看表主键信息SELECTt.TABLE_NAME,t.CONSTRAINT_TYPE,c.C...

    一文读懂MySQL的架构设计

    MySQL是一种流行的开源关系型数据库管理系统,它由四个主要组件构成:协议接入层...

    MySQL中的存储过程和函数

    原文地址:https://dwz.cn/6Ysx1KXs作者:best.lei存储过程和函数简单的说,存储过程就是一条或者多条SQL语句的集合。可以视为批文件,但是其作用不仅仅局限于批处理。本文主要介...

    创建数据表:MySQL 中的 CREATE 命令深入探讨

    数据库是企业日常运营和业务发展的不可缺少的基石。MySQL是一款优秀的关系型数据库管理系统,它支持数据的插入、修改、查询和删除操作。在数据库中,表是一个关系数据库中用于保存数据的容器,它由表定义、表...

    SQL优化——IN和EXISTS谁的效率更高

    IN和EXISTS被频繁使用在SQL中,虽然作用是一样的,但是在使用效率谁更高这点上众说纷纭。下面我们就通过一组测试来看,在不同场景下,使用哪个效率更高。...

    在MySQL中创建新的数据库,可以使用命令,也可以通过MySQL工作台

    摘要:在本教程中,你将学习如何使用MySQLCREATEDATABASE语句在MySQL数据库服务器上创建新数据库。MySQLCREATEDATABASE语句简介...

    SQL查找是否"存在",别再用count了

    根据某一条件从数据库表中查询『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECTCOUNT(*)呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往...

    解决Mysql数据库提示innodb表不存在的问题

    发现mysql的error.log里面有报错:>InnoDB:Error:Table"mysql"."innodb_table_stats"notfo...

    Mysql实战总结&面试20问

    1、MySQL索引使用注意事项1.1、索引哪些情况会失效查询条件包含or,可能导致索引失效如果字段类型是字符串,where时一定用引号括起来,否则索引失效...

    MySQL创建数据表

    数据库有了后,就可以在库里面建各种数据表了。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性)约束的过程。后面也是通过SQL语句和Navicat...

    MySQL数据库之死锁与解决方案

    一、表的死锁产生原因:...

    MySQL创建数据库

    我的重点还是放在数据表的操作,但第一篇还是先介绍一下数据表的容器数据库的一些操作。主要涉及数据库的创建、修改、删除和查看,下面演示一下用SQL语句创建和用图形工具创建。后面主要使用的工具是Navica...

    MySQL中创建触发器需要执行哪些操作?

    什么是触发器触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段...

    《MySQL 入门教程》第 17 篇 MySQL 变量

    原文地址:https://blog.csdn.net/horses/article/details/107736801原文作者:不剪发的Tony老师来源平台:CSDN变量是一个拥有名字的对象,可以用于...

    关于如何在MySQL中创建表,看这篇文章就差不多了

    数据库技术是现代科技领域中至关重要的一部分,而MySQL作为最流行的关系型数据库管理系统之一,在数据存储和管理方面扮演着重要角色。本文将深入探讨MySQL中CREATETABLE语句的应用,以及如何...

    取消回复欢迎 发表评论: