一文读懂MySQL的架构设计
yuyutoo 2024-11-17 17:54 6 浏览 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查询请求,并进行初始分析、解析和预处理。
- 查询缓存(MySQL8.0 中不存在):MySQL会将查询语句和其结果缓存在内存中。当收到一个相同的查询请求时,先检查缓存中是否有匹配的结果。如果有匹配结果,则直接返回,并跳过剩余的处理步骤。如果没有匹配,将继续执行下一个步骤。
- SQL解析器:服务层的SQL解析器主要进行语法解析。解析器会根据MySQL词法分析器和语法分析器的解析规则,将查询语句解析成一个字符串表示的树状结构,用于存储语法单位(词素)及它们之间的关系。
- 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的服务层负责事务管理,确保在执行一系列操作时,满足原子性、一致性、隔离性和持久性这四个特性。事务管理涉及的主要功能包括:
- 事务隔离级别:MySQL支持四个事务隔离级别:读未提交、读已提交、可重复读和串行化。这些隔离级别分别定义了事务间数据访问的隔离程度,用于防止脏读、不可重复读和幻读。
- 锁管理:在事务过程中,可能需要对数据加锁,以确保数据的一致性。MySQL支持的锁类型包括共享锁、排它锁、意向锁、行锁、表锁等。
- Undo日志:服务层通过Undo日志实现了事务回滚操作,当事务执行中途出现异常或用户发出回滚请求时,可以通过Undo日志回滚数据到事务开始前的状态。
- Redo日志:为了保证事务的持久性,在事务执行过程中,修改的数据首先写入到Redo日志中,再更新到磁盘文件上。在系统恢复过程中,可以通过Redo日志进行数据恢复。
缓存管理
MySQL优化器使用缓存来提高查询速度,包括:
- 查询缓存:当相同的SQL查询被多次执行时,可以从查询缓存中直接获取结果,提高性能。由于MySQL 8.0中已移除了查询缓存功能,使用者需要自行实现相关功能,如使用Redis、Memcached等中间缓存系统。
- 表缓存:用于存储表的元数据,如表的结构定义。当查询需要表信息时,优先从表缓存中获取,避免磁盘操作。
- 线程缓存:用于复用服务器的连接线程。当一个连接关闭后,它的线程会被放回线程缓存池中,供新的连接使用。线程池意味着减少了创建和销毁线程的开销。
- 缓冲池:主要用于InnoDB存储引擎,缓冲池管理缓存的数据页,包括数据和索引。当需要访问这些页时,可以直接从缓冲池读取,提高访问速度。
存储引擎层
存储引擎层是 MySQL 的核心组件之一,它负责管理数据的存储和检索。MySQL 支持多个存储引擎,如 InnoDB、MyISAM、Memory 等。每个存储引擎都有不同的特性和适用场景。MySQL支持多种存储引擎,每种引擎各有特点,根据实际需求进行选用。当然,只要没有非常明确的特殊需求就不需要更改存储引擎,因为InnoDB在大部分场景下都比其他引擎更加适用。引擎层通过标准API与服务层交互,实现数据的存储和查询。
- InnoDB:InnoDB是MySQL的默认存储引擎,提供了事务支持、行级锁定、外键约束等功能,适用于需要高并发和数据一致性的OLTP应用程序。
- MyISAM:MyISAM通常用于只读数据表,适用于简单查询和全文索引。其不支持事务、行级锁等功能,适用于读取密集型应用程序OLAP场景。
- Memory:Memory存储引擎支持哈希和B树索引,它将数据存储在内存中,易受到系统断电或宕机等影响,具有较高的写性能但不适用于大规模数据分布。
- 其他存储引擎: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中查询缓存这个选项也是默认关闭的。
- 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
- 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
- 上一篇:MySQL中的存储过程和函数
- 下一篇:mysql数据库如何快速获得库中无主键的表
相关推荐
- 电脑 CMD 命令大全:简单粗暴收藏版
-
电脑CMD命令大全包括了许多常用的命令,这些命令可以帮助用户进行各种系统管理和操作任务。以下是一些常用的CMD命令及其功能:1、系统信息和管理...
- 电脑维修高手必备!8个神奇DOS命令,自己动手不求人
-
我相信搞电脑维修或者维护的基本都会些DOS的命令。就算Windows操作系统是可视化的界面,但很多维护检查是离不开DOS命令的。掌握好这些命令,你不仅能快速诊断问题,还能解决90%的常见电脑故障。下...
- 一个互联网产品总监的设计技巧总结 - 技术篇
-
古语:工欲善其事必先利其器。往往在利其器后我们才能事半功倍。从这个角度出发成为一个合格的产品经理你需要的是“利其器”,这样你才能产品的设计过程中如鱼得水,得心应手。有些产品经理刚入职,什么都感觉自己欠...
- 超详解析Flutter渲染引擎|业务想创新,不了解底层原理怎么行?
-
作者|万红波(远湖)出品|阿里巴巴新零售淘系技术部前言Flutter作为一个跨平台的应用框架,诞生之后,就被高度关注。它通过自绘UI,解决了之前RN和weex方案难以解决的多端一致性...
- 瑞芯微RK3568|SDK开发之环境安装及编译操作
-
1.SDK简介一个通用LinuxSDK工程目录包含有buildroot、app、kernel、device、docs、external等目录。其中一些特性芯片如RK3308/RV1108/R...
- 且看L-MEM ECC如何守护i.MXRT1170从核CM4
-
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEMECC功能。本篇是《简析i.MXRT1170Cortex-M7F...
- ECC给i.MXRT1170 FlexRAM带来了哪些变化?
-
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAMECC功能。ECC是“ErrorCorrectingCode”...
- PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全
-
PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全资源宝整理分享:https://www.htple.net...
- 从零开始移植最新版本(2023.10)主线Uboot到Orange Pi 3(全志H6)
-
本文将从零开始通过一步一步操作来实现将主线U-Boot最新代码移植到OrangePi3(全志H6)开发板上并正常运行起来。本文从通用移植思路的角度,展现是思考的过程,通过这种方式希望能让读者一通百...
- 可视化编程工具Blockly——定制工具箱
-
1概述本文重点讲解如何定制Blocklytoolbox上,主要包含如下几点目标:如何为toolbox不同类别添加背景色如何改变选中的类别的外观如何为toolbox类别添加定制化的css如何改变类别...
- 用户界面干货盘点(用户界面的基本操作方法)
-
DevExpressDevExpressWPF的DXSplashScreen控件在应用加载的时候显示一个启动界面。添加DXSplashScreen后,会默认生成一个XAML文件,当然,你也可...
- Vue3+Bootstrap5整合:企业级后台管理系统实战
-
简洁而不简单,优雅而不失强大在当今快速发展的企业数字化进程中,高效、美观的后台管理系统已成为企业运营的核心支撑。作为前端开发者,我们如何选择技术栈,才能既保证开发效率,又能打造出专业级的用户体验?答案...
- 什么?这三款i.MXRT型号也开放了IAP API?
-
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1050/1020/1015系列ROM中的FlexSPI驱动API使用。今天痞子衡去4S店给爱车做保养了,...
- OneCode基础组件介绍——表格组件(Grid)
-
在企业级应用开发中,表格组件是数据展示与交互的核心载体。OneCode平台自研的Grid表格组件,以模型驱动设计...
- 开源无线LoRa传感器(光照温湿度甲醛Tvoc)
-
本开源项目基于ShineBlinkC2M低代码单片机实现,无需复杂单片机C语言开发。即使新手也可很容易用FlexLua零门槛开发各种功能丰富稳定可靠的IoT硬件,更多学习教程可参考Flex...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)