MySQL —— MySQL逻辑架构与查询过程
文章目录
- MySQL逻辑架构整体分为三层
- 连接层
- 服务层
- 查询缓存
- 解析器
- 优化器
- 执行器
- 存储引擎层
- 系统文件层
- MySQL 查询过程
- 查询过程框图
博客1
博客2
MySQL逻辑架构整体分为三层
-
最上层为客户端层,并非MySQL所独有,诸如:连接管理、授权认证、权限校验等功能均在这一层处理。
-
MySQL大多数核心服务均在中间这一层,包括查询解析、优化、执行、缓存、内置函数(比如:时间、数学、加密等函数)。所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等。
-
最下层为存储引擎,其负责 MySQL 中的数据存储和提取。和 Linux 下的文件系统类似,每种存储引擎都有其优势和劣势。中间的服务层通过API与存储引擎通信,这些API接口屏蔽了不同存储引擎间的差异。
连接层
连接层主要负责连接管理、授权认证、权限校验等功能。
-
连接管理:
负责客户端与 MySQL 服务器之间的连接建立、维护和终止。客户端发起连接请求,MySQL 服务器接收到请求;每个客户端连接对应服务器上的一个线程,服务器利用线程池来管理这些连接,避免频繁创建和销毁线程,提高效率;当客户端请求断开连接时,服务器会关闭相应的线程,释放资源;
-
身份认证:
在客户端输入连接命令(如 mysql -uxxx -pxxx)后,连接层的第一步是进行身份验证。通过用户名和密码进行认证,确保只有授权用户才能访问数据库。还支持 SSL 证书认证,提供更高级别的安全性,确保数据在传输过程中不被窃取。认证成功后,服务器会加载用户的权限信息。
-
权限校验:
登录后,连接层会检查用户是否有执行特定操作的权限。这包括对数据库、表和其他资源的访问控制,确保用户只能访问其权限范围内的数据。如果权限不足,服务器会拒绝该请求,并返回相应的错误信息。
-
比如输入的 mysql -uxxx -pxxx 之后,来到MySQL的第一件事就是校验身份,权限等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到 MySQL 服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过 SSL 证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。
服务层
- 认证成功过后,接下来就来到服务层了,服务层是 MySQL 的核心,MySQL 的核心服务层都在这一层,包括要执行的任何 SQL 语句,普通的 DDL、DML、DQL、存储过程、视图、触发器等都需要经过这一层的一些操作,最终才可以被 MySQL 识别。主要经过有 SQL 解析器、SQL 优化器等,最终还会经过查询缓存,总之,所有跨存储引擎的功能都在这一层实现。
查询缓存
-
在执行 SELECT 语句之前,MySQL 会检查查询缓存(Query Cache)。如果相同的 SQL 查询请求已经存在于缓存中,MySQL 会直接返回缓存中的结果,服务器就不需要再执行查询解析、优化和执行的整个过程;
-
对于相同的查询请求,可以快速返回结果,减少处理时间。但不推荐使用查询缓存,为什么呢?因为查询缓存往往弊大于利。一旦对表进行任何更新(如 INSERT、UPDATE 或 DELETE),该表上的所有查询缓存都会被清空。这导致在高更新频率的数据库中,查询缓存的命中率很低,反而会影响性能。除非业务需求中需要使用一张静态表,很长时间才会更新一次,比如系统配置表,那这张表上的查询才适合使用查询缓存。MySQL8.0 彻底废弃了查询缓存的功能,MySQL 8.0 的设计更注重高效的查询处理和优化,而不是依赖查询缓存。
-
虽然查询缓存已被废弃,但在早期版本中,开发者仍然可以通过设置 query_cache_type 参数来控制缓存行为。可以将参数 query_cache_type 设置成DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。
解析器
-
如果缓存没有命中的话,MySQL 解析器会对查询语句进行进行语法和语义分析,确保 SQL 语句符合 SQL 标准,并且逻辑上正确。解析的结果生成一个内部表示,这个表示用于后续的优化和执行。简单说解析的作用将我们人能看懂的 SQL 解析成 MySQL 能识别的语言;
-
解析器先会做 “词法解析”。词法解析是一种将输入的 SQL 语句分解为基本组成部分的过程,这些组成部分称为“词法单元”。MySQL 会识别出 SQL 语句中的关键字(如 SELECT、FROM、WHERE 等)、表名、列名等,并将其分类。也就是 MySQL 需要识别出里面的字符串分别是什么,代表什么;
-
做完“词法解析”,接着做“语法解析”。语法解析基于词法解析的结果,检查 SQL 语句的结构是否符合 MySQL 的语法规则,判断输入的这个 SQL 语句是否满足 MySQL 语法。如果语法正确,语法解析器会生成一个语法树(或解析树),这是 SQL 语句的内部表示形式,便于后续处理;
优化器
-
经过了解析器器,MySQL 知道要做什么了。接下来并不是直接执行,而是会在优化器这一层进行优化,优化器是个非常复杂的部件,它会按照它认为的最好的方式去优化这条 SQL 语句,并生成一条条的执行计划。
优化过程可能包括选择合适的索引、确定连接顺序、重写查询等,以提高查询性能:
- 索引选择:当查询涉及多个索引时,优化器会评估每个索引的使用效率,决定采用哪个索引进行查询。这包括考虑索引的选择性、数据分布等因素;
- 连接顺序优化:在执行多表关联(JOIN)时,优化器会决定表的连接顺序。不同的连接顺序可能会导致不同的查询效率,优化器会选择最优的顺序;
- 查询重写:优化器可以对 SQL 语句进行重写,以简化查询并提升性能。例如,它可能会将某些子查询转换为 JOIN,从而减少数据处理的复杂性;
例如在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。比如你执行下面这样的语句,这个语句是执行两个表的join:
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
-
既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20。
-
也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10。
这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。
优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。
执行器
-
MySQL 通过解析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段。执行器会根据优化器生成的执行计划,去调用执行引擎会调用相应的存储引擎接口,进行数据的读取、插入、更新和删除操作;
-
在执行 SQL 语句之前,执行器会首先检查用户对目标表的操作权限;
mysql> select * from T where ID=10; ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'
-
如果有权限,就打开表继续执行。打开表的时候,执行器根据表的存储引擎定义,使用相应的存储引擎接口打开表;
-
比如上述sql查询表T语句,ID字段没有索引,执行器的执行流程处理流程:
- 调用 InnoDB 引擎接口,读取表的第一行数据,检查 ID 值是否为 10。如果 ID 值不匹配,则跳过这行;如果匹配,则将该行添加到结果集中;
- 继续调用引擎接口获取“下一行”数据,重复上述检查逻辑,直到遍历完整个表;
- 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
-
对于有索引的表,执行的逻辑与无索引的表类似,但效率更高。
- 执行器首先调用引擎接口,获取满足条件的第一行数据,由于索引的存在,查找和定位数据的过程更为高效;
- 通过调用接口,循环获取“满足条件的下一行”,直到没有更多匹配的行。每次获取时,执行器会根据索引的顺序直接定位到相关数据,减少了不必要的全表扫描;
- 将所有满足条件的记录组成的结果集返回给客户端;
存储引擎层
-
根据优化器生成的执行计划,执行引擎负责实际的数据检索和操作。执行引擎会调用相应的存储引擎接口,进行数据的读取、插入、更新和删除操作;
-
MySQL 提供了可插拔式的存储引擎,即 “插上什么存储引擎,就有什么功能”,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信,不同的存储引擎具有功能不同。不同的存储引擎将直接决定了数据存储到磁盘的方式。例如,InnoDB 使用聚簇索引存储数据,而 MyISAM 使用非聚簇索引;
系统文件层
- 系统文件层是 MySQL 逻辑架构中负责数据持久化和存储的底层组件。它主要涉及数据的存储与管理,确保数据能够安全、有效地写入磁盘,并与存储引擎进行交互。
- 数据存储:负责将数据以文件的形式存储在操作系统的文件系统中;
- 与存储引擎交互:系统文件层通过 API 与存储引擎进行通信,完成数据的写入和读取操作。这一层使存储引擎能够透明地处理数据存储的细节。
MySQL 查询过程
查询过程框图
我们总是希望MySQL能够获得更高的查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。
当向MySQL发送一个请求的时候,MySQL到底做了些什么呢?
-
接收请求
客户端连接:客户端通过连接管理与 MySQL 服务器建立连接,并发送 SQL 查询请求。
-
查询缓存(可选)
如果启用了查询缓存,MySQL 会检查该查询是否已有缓存的结果。如果缓存中存在该查询的结果,MySQL 会直接返回缓存结果,而无需执行查询。
-
查询解析
语法解析:MySQL 的查询解析器会检查 SQL 查询的语法,确保其符合 SQL 标准。
语义分析:解析器验证表名、列名是否存在,以及用户是否有权限执行该查询。
-
查询优化
生成执行计划:查询优化器分析解析后的 SQL 语句,生成一个或多个执行计划。
优化器使用统计信息(如表的行数、索引的选择性等)来评估不同的执行计划,并选择最优的执行路径。
-
执行查询
调用存储引擎:优化后的执行计划会被传递给执行引擎,MySQL 根据计划调用相应的存储引擎执行实际的数据操作。
数据检索:存储引擎根据执行计划从磁盘读取数据,进行必要的计算和处理(如连接、排序等)。
-
返回结果
结果集返回:执行引擎将结果集通过服务层返回给客户端。
连接管理:客户端接收到结果后,可以继续发送其他查询或关闭连接。
详解一条 SQL 的执行过程
相关文章:

MySQL —— MySQL逻辑架构与查询过程
文章目录 MySQL逻辑架构整体分为三层连接层服务层查询缓存解析器优化器执行器 存储引擎层系统文件层 MySQL 查询过程查询过程框图 博客1 博客2 MySQL逻辑架构整体分为三层 最上层为客户端层,并非MySQL所独有,诸如:连接管理、授权认证、权限校…...

ODOO学习笔记(12):自定义模块开发
一、Odoo模块结构基础 基本目录结构 Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹: __init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. impo…...

Excel单元格中自适应填充多图
实例需求:在Excel插入图片时,由于图片尺寸各不相同,如果希望多个图片填充指定单元格,依靠用户手工调整,不仅费时费力,而且很难实现完全填充。如下图中的产品图册,有三个图片,如下图所…...

20.useMediaQuery
React useMediaQuery 钩子:如何优雅地实现响应式设计? 在现代 Web 开发中,响应式设计是一个关键概念,它允许应用根据不同的屏幕尺寸和设备特性调整其布局和行为。useMediaQuery 钩子提供了一种声明式的方法来在 React 组件中使用媒体查询,使得响应式逻辑的实现变得简单而…...

无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:无人机场景车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…...

聚合查询(查询)
count:统计表中所有的行数 指定某一列不统计NULL sum:求和 NULL值不参与计算(省略) avg():对所有行的指定列求平均值 max() min():求所有指定行中最大值与最小值 分组查询 group by: ROUDN()小数点 havin…...

QT QLineEdit失去焦点事件问题与解决
本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题! 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…...

Remora
Remora Remora 模型能够独立于碱基识别过程预测甲基化/修饰碱基的状态。Remora 仓库专注于准备修饰碱基训练数据和训练修饰碱基模型。此外,还提供了一些用于运行 Remora 模型和调查原始信号的功能。对于生产环境中的修饰碱基识别,建议使用 Dorado <https://github.com/na…...

MySQL中将一个字符串字段按层级树状展开
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式: 1.分析 1.他的层级个数是不确定的,也就是说有的有2层有的有5…...

vue面试题8|[2024-11-14]
问题1:什么是渐进式框架? vue.js router vuex element ...插件 vue.js 渐0 router 渐1 vuex 渐2 vue.js只是一个核心库,比如我再添加一个router或者vuex,不断让项目壮大,就是渐进式框…...

ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型
本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统,旨在通过技能匹配的方式对招聘信息进行分析与预测,帮助求职者根据自身技能找到最合适的职位,同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…...

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)
MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH(广义自回归条件异方差)模型计算VaR(风险价值)时,方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…...

深入Linux基础:文件系统与进程管理详解
在Linux运维领域,文件系统和进程管理是两个至关重要的基础知识。理解它们的原理和实际操作,不仅有助于我们更高效地管理服务器,还能快速定位问题、优化性能。本文将带你全面了解这两大模块,并配以示例代码进行讲解,帮助…...

缓存及其不一致
在实际开发过程中,一般都会遇到缓存,像本地缓存(直接在程序里搞个map也可以,但是可能会随着数据的增长出现OOM,建议使用正经的本地缓存框架,因为自己实现淘汰策略啥的挺费劲的)、分布式缓存&…...

Leetcode 有效的数独
这段代码解决的是 验证一个数独是否有效 的问题,其算法思想是基于 规则校验和状态记录。具体思想如下: 算法思想 核心目标: 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录: 使用 3 个布尔二维数组分别…...

《Java核心技术 卷I》用户界面中首选项API
首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…...

Android 中的 Zygote 和 Copy-on-Write 机制详解
在 Android 系统中,Zygote 是一个关键的进程,几乎所有的应用进程都是通过它 fork(派生)出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势,这得益于 fork 操作和 Linux 中的 Copy-on-Write(COW&am…...

【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 逻辑回归是一种经典的统计学习方法,用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…...

推荐一款功能强大的光学识别OCR软件:Readiris Dyslexic
Readiris Dyslexic是一款功能强大的光学识别OCR软件,可以扫描任何纸质文档并将其转换为完全可编辑的数字文件(Word,Excel,PDF),然后用你喜欢的编辑器进行编辑。该软件提供了一种轻松创建,修改和签名PDF的完整解决方法&…...

Python爬虫----python爬虫基础
一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…...

css-50 Projects in 50 Days(3)
html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…...

另外一种缓冲式图片组件的用法
文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…...

字节青训-小C的外卖超时判断、小C的排列询问
目录 一、小C的外卖超时判断 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、小C的排列询问 问题描述 测试样例 最终代码: 运行结果: 编辑 一、小C的外卖超时判断…...

PHP 伪静态详解及实现方法
概述 在现代 Web 开发中,URL 的设计对用户体验和搜索引擎优化(SEO)至关重要。动态 URL 虽然功能强大,但往往显得冗长且不友好。伪静态(URL 重写)技术通过将动态 URL 转换为静态样式,不仅提高了…...

Spring Boot 简单预览PDF例子
目录 前言 一、引入依赖 二、使用步骤 1.创建 Controller 处理 PDF 生成和预览 2.创建预览页面 总结 前言 使用 Spring Boot 创建一个生成 PDF 并进行预览的项目,你可以按以下步骤进行。我们将使用 Spring Boot、Thymeleaf、iText 等技术来完成这个任务。 一、引入…...

【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...

LabVIEW 使用 Snippet
在 LabVIEW 中,Snippet(代码片段) 是一个非常有用的功能,它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段,并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet? Snippet 就是 LabVIEW 中的…...

单片机_day3_GPIO
目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…...

Python小游戏24——小恐龙躲避游戏
首先,你需要安装Pygame库。如果你还没有安装,可以通过以下命令安装: 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …...