搞懂 MySql 的架构和执行流程

搞懂 MySql 的架构和执行流程

  • 1、MySQL 的三层架构
  • 2、SQL 的执行流程
    • 2.1、连接器
    • 2.2、解析器
    • 2.3、预处理器
    • 2.4、优化器
    • 2.5、执行器
    • 2.6、存储引擎
  • 3、关于Select 的两个顺序

 

1、MySQL 的三层架构

 
MySQL的三层结构包括:

  1. 连接层:负责与MySQL客户端之间的通信,提供如连接处理,身份验证等功能。
  2. 服务层:在MySQL数据库系统处理底层数据之前的所有工作,都是在服务层完成的。包括权限判断,SQL 解析,行计划优化,query cache的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。
  3. 引擎层:负责存储和获取所有存储在MySQL中的数据。

 

2、SQL 的执行流程

 
在这里插入图片描述
查询缓存 在5.7版本和之前的版本存在,由于命中率较低,比较鸡肋等原因,5.8版本已经不存在了,这里就不过多讨论 查询缓存。
 

2.1、连接器

 
连接器:尝试连接MySql,建立连接。
客户端访问 MySQL 服务器之前,首先会建立 TCP 连接,经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证和权限获取。

  • 用户名或密码不对,会收到一个 Access denied for user 错误,客户端程序结束执行。
  • 用户名密码认证通过,会从权限表查询账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限。
  • 多个客户端可以和一个MySQL服务器建立连接,每个客户端和一个MySQL服务器可以建立多个连接。MySQL 服务器里有专门的 TCP连接池限制连接数,采用长连接模式复用TCP连接

 

2.2、解析器

 
解析器:解析Sql语句,会把一条sql语句解析语法树。(包含词法解析和语法解析)

  • 在解析器中对 SQL 语句进行语法分析、词法分析。将 SQL 语句分解成数据结构,并将这个结构传递到后续步骤,以后 SQL 语句的传递和处理就是基于这个结构。如果在分解构成中遇到错误,那么就说明这个 SQL 语句是不合理的。
  • 在 SQL 命令传递到解析器的时候,会被解析器验证和解析,并为其创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL 还会对 SQL 查询进行语法上的优化,进行查询重写。

在这里插入图片描述

 

2.3、预处理器

 
       预处理器的任务根据MySQL的相关规则对解析器生成的SQL语句解析树进行进一步的校验和处理。包括检查数据库中的数据表、数据列是否存在,并对别名进行校验,检查别名是否存在重名和歧义等情况。

       预处理器的目的是确保SQL语句的合法性和正确性,以及优化查询性能。通过预处理操作,可以避免在查询执行过程中出现错误,提高查询的效率和稳定性。

 

2.4、优化器

 

在这里插入图片描述

一条查询可以有很多种执行方式,最后都会返回相同的结果。优化器的作用就是找到这其中最好的执行计划

  • SQL 语句在语法解析之后、查询之前会使用查询优化器确定 SQL 语句的执行路径,生成一个 执行计划.

  • 这个执行计划表明应该使用哪些索引进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按执行计划中的步骤,调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。

  • 它使用 选取-投影-连接策略进行查询。例如:

    SELECT id,name,age FROM tb_user WHERE gender = '男';
    -- 该查询语句先根据 WHERE 进行选取,而不是将表全部查询出来以后再进行 gender 过滤。
    -- 同时,该查询语句先根据 id,name,age 进行属性投影,而不是将属性全部取出后再进行过滤,将这两个查询条件 连接 起来,生成最终的结果。
    

查询优化器,分为逻辑查询优化阶段、物理查询优化阶段。

  • 逻辑查询优化:通过改变 SQL 语句的内容来使得 SQL 查询更高效,同时为物理查询优化提供更多的候选执行计划。通常采用的方式是对 SQL 语句进行 等价变换,对查询进行 重写,而查询重写的数学基础就是关系代数。对条件表达式进行等价谓词重写、条件简化、对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。
  • 物理查询优化:基于关系代数进行的查询重写,而关系代数的每一步都对应着物理计算,这些物理计算往往存在多种算法,因此需要计算各种物理路径的代价,从中选择代价最小的作为执行计划。在这个阶段中,对于单表和多表连接的操作,需要高效地使用索引,提升查询效率。

 

2.5、执行器

 
执行器,负责根据优化器生成的执行计划,执行SQL语句,并返回结果集。其主要功能包括:

  • 与存储引擎交互:执行器通过调用存储引擎的API来操作数据,执行查询、更新、插入等操作。不同的存储引擎有不同的接口和实现方式,执行器需要与存储引擎紧密配合,确保数据操作的正确性和高效性。

  • 权限校验:在执行SQL语句之前,执行器会进行权限校验,确保当前用户有权执行该语句。如果权限不足,执行器会返回相应的错误信息。

  • 执行计划执行:根据优化器生成的执行计划,执行器会按照计划逐步执行SQL语句,访问相关的数据表,执行相应的操作,并生成结果集。

 

2.6、存储引擎

 
存储引擎层,负责了 MySQL 中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有不同的功能,由此使用者可以根据自己的实际需求进行存储引擎的选取。

 

3、关于Select 的两个顺序

 
关键字的顺序不能颠倒

SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT

 
SELECT 语句的执行顺序

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
  1. FROM:首先,MySQL会根据FROM子句找到需要查询的表。
  2. JOIN:接着,如果有JOIN操作,MySQL会根据JOIN类型(如INNER JOIN、LEFT JOIN等)和其他JOIN条件,将多个表连接在一起。
  3. WHERE:然后,MySQL会对连接后的表应用WHERE子句中的过滤条件,筛选出满足条件的记录。
  4. GROUP BY:如果有GROUP BY子句,MySQL会按照指定的列进行分组。
  5. HAVING:接着,MySQL会对分组后的结果应用HAVING子句中的过滤条件,进一步筛选分组。
  6. SELECT:然后,MySQL会对筛选后的记录应用SELECT子句,选择需要的列。
  7. DISTINCT:如果使用了DISTINCT关键字,MySQL会去除选择列中的重复值。
  8. ORDER BY:如果有ORDER BY子句,MySQL会按照指定的列进行排序,返回结果集。
  9. LIMIT:最后,如果使用了LIMIT子句,MySQL会限制返回的数据行数。
  10. 以上是MySQL中SELECT语句的一般执行顺序,具体执行过程可能会因为查询优化和其他因素而有所变化。
     
# 举例:
SELECT DISTINCT <select_list>
FROM <left_table> <join_type>
JOIN <right_table> ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number># 执行顺序如下1   FROM <left_table>
2   ON <join_condition>
3   <join_type> JOIN <right_table>
4   WHERE <where_condition>
5   GROUP BY <group_by_list>
6   HAVING <having_condition>
7   SELECT
8   DISTINCT <select_list>
9   ORDER BY <order_by_condition>
10  LIMIT <limit_number>
-- 举例说明
SELECT DISTINCT id,name,count(*) as num  # 顺序5 
FROM tb_users u inner join tb_team t on u.team_id = t.id  # 顺序1 
WHERE u.age > 18   # 顺序2 
GROUP BY t.id      # 顺序3
HAVING num > 2     # 顺序4
ORDER BY num DESC  # 顺序6
LIMIT 3    # 顺序7

       在 SELECT 语句执行的步骤中,每一个步骤都会产生一个 虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。上面这些执行步骤都隐含在 SQL 的执行过程中,对于我们是不可见的。
 
 
 
 
 
 
 
.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/173048.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因

写在之前&#xff08;吐槽&#xff09; 最近由于变化了一些工作方向&#xff0c;开始需要使用matlab进行开发&#xff0c;哎哟喂&#xff0c;matlab使用的我想吐&#xff0c;那个matlab编辑器又没代码提示&#xff0c;又没彩色&#xff0c;我只好用vscode进行代码编辑&#xf…

13.6性能测试理论

一.什么是性能测试 1.定义: 测试人员借助性能测试工具(LoadRunner等),模拟系统在不同场景下(使用高峰期等),对应的性能指标是否达到预期. 2.性能测试和功能测试的区别: a.功能测试依靠人工,性能测试依靠工具. b)功能测试要求软件能正常运行,不管什么场景,性能测试要求软件…

嵌入式 Tomcat 调校

SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow&#xff0c;——这是怎么做到的&#xff1f;我们以 Tomcat 为例子&#xff0c;尝试调用嵌入式 Tomcat。 调用嵌入式 Tomcat&#xff0c;如果按照默认去启动&#xff0c;一个 main 函数就可以了。 简单的例子 下面是启动…

故障诊断入门书籍资料免费领取

前言 本期分享免费提供9本故障诊断领域相关的书籍资料&#xff0c;可自行下载 一、主要内容 二、书籍获取

VR结合|山海鲸虚拟展厅解决方案

方案背景 虚拟现实技术是另一项革命性的创新&#xff0c;它可以将用户带入一个完全虚拟的环境中。借助VR头盔和控制器&#xff0c;用户可以亲临虚拟现实中&#xff0c;与数字世界互动&#xff0c;仿佛置身于其中。 山海鲸根据用户实际需求变化将数字孪生与虚拟现实技术相结合…

Web攻防06_sqlmap的使用

文章目录 参考链接&#xff1a; SQLMAP简介支持五种不同的注入模式 数据猜解-库表列数据权限操作引出权限&#xff1a;引出文件&#xff1a;引出命令&#xff08;执行命令&#xff09;&#xff1a; 提交方法-POST&HEAD&JSONPost注入cookie注入注入请求头中&#xff08;…

【1++的Linux】之进程间通信

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;进程间通信的目的二&#xff0c;管道 一&#xff0c;进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;…

深度学习:张量 介绍

张量[1]是向量和矩阵到 n 维的推广。了解它们如何相互作用是机器学习的基础。 简介 虽然张量看起来是复杂的对象&#xff0c;但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表&#xff1a; 矩阵是向量的二维列表&#xff1a; 下标…

unity button移动位置some values driven by canvas

1 可以在button父节点把限制取消勾选 2 在不动整个布局的情况下&#xff0c;只修改局部变量&#xff1a;忽略布局即可

【C++】list的介绍及使用 | 模拟实现list(万字详解)

目录 一、list的介绍及使用 什么是list&#xff1f; list的基本操作 增删查改 获取list元素 不常见操作的使用说明 ​编辑 接合splice ​编辑 移除remove 去重unique 二、模拟实现list 大框架 构造函数 尾插push_back 迭代器__list_iterator list的迭代器要如何…

2023年MathorCup高校数学建模挑战赛大数据挑战赛赛题浅析

比赛时长为期7天的妈杯大数据挑战赛如期开赛&#xff0c;为了帮助大家更好的选题&#xff0c;首先给大家带来赛题浅析&#xff0c;为了方便大家更好的选题。 赛道 A&#xff1a;基于计算机视觉的坑洼道路检测和识别 A题&#xff0c;图像处理类题目。这种题目的难度数模独一档…

TextureView和SurfaceView

1、Surface Surface对应了一块屏幕的缓冲区&#xff0c;每一个window对应一个Surface&#xff0c;任何View都是画在Surface上的&#xff0c;传统的View共享一块屏幕缓冲区&#xff0c;所有的绘制都必须在UI线程上进行。 2、SurfaceView 顾名思义就是Surface的View&#xff0c;…

Python爬虫网易云音乐,Tkinter制作音乐播放器

目录 一、效果展示 二、环境 三、实现过程 四、源码 一、效果展示 页面的美化以及功能还有待升级~ 先来说一下已有功能吧&#xff1a; 可以在搜索框中通过歌曲或歌手名称进行搜索&#xff0c;效果和在网易云官网搜索一样。 点击开始下载&#xff0c;就会将搜索结果的第一…

FoLR:Focus on Local Regions for Query-based Object Detection论文学习笔记

论文地址&#xff1a;https://arxiv.org/abs/2310.06470 自从DETR问询式检测器首次亮相以来&#xff0c;基于查询的方法在目标检测中引起了广泛关注。然而&#xff0c;这些方法面临着收敛速度慢和性能亚优等挑战。值得注意的是&#xff0c;在目标检测中&#xff0c;自注意力机制…

H5游戏源码分享-手机捉鬼游戏

H5游戏源码分享-手机捉鬼游戏 一款考验手速的游戏 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>手机捉鬼 微信HTML5在线朋友圈游戏</title><meta name&…

SSM度假村管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 度假村管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要 采用B/S模式开发…

计算机毕设 opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

VulnHub DC-1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径&#xff0c;到拼雷达、算力&#xff0c;再到如今的性价比之争&#xff0c;自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年&#xff0c;黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…

“爱知道”,你知道吗?

拥抱时代浪潮&#xff0c;加速科技变革。数字经济时代&#xff0c;杭州重点贯彻市委市政府数字经济创新提质“一号发展工程”&#xff0c;加快发展数字经济&#xff0c;推动全市数字经济往高攀升、向新进军、以融提效。基于政府对数字经济新活力的赋能、优化数字社会环节、构建…