MySQL的体系结构与SQL的执行流程

文章目录

  • 前言
  • 体系结构
  • SQL语句的执行流程
    • 1、连接MySQL
    • 2、查询缓存
    • 3、解析SQL语句
    • 4、优化SQL语句
    • 5、执行SQL语句
  • 总结

前言

如果你在使用MySQL时只会写sql语句的,那么你应该看一下《MySQL优化的底层逻辑》。如果你只了解到sql是如何优化的,那么你应该通过本文了解一下Mysql的体系结构以及sql语句的执行流程。

体系结构

先来看下MySQL的体系结构,下图是在MySQL官方网站上扒下来的,所以有很高的权威性和准确性。

在这里插入图片描述

通过这张图,我们可以直观的看到MySQL的内部结构,包括连接器、缓存、解析器、优化器、存储引擎以及支持DDL、DML、存储过程、视图等功能的SQL接口。接下来,通过一条sql语句的执行来深入了解MySQL各个组件功能以及其作用。

SQL语句的执行流程

1、连接MySQL

通常我们会编写sql语句通过某个客户端来执行并且接受执行结果,比如命令行、JDBC、navicat。但是在执行前肯定需要先和MySQL服务成功建立连接,这个就是「连接器」的工作。

这里通过命令行的方式MySQL服务建立连接,命令如下:

mysql -h127.0.0.1 -uroot -p

命令连接的是本地的MySQL服务,在输入密码后,连接器会验证用户和密码,如果验证失败会给客户端响应拒绝访问的信息。

在这里插入图片描述

验证成功后,连接器会与该客户端成功建立连接并且读取该用户的权限,用户之后的操作都会基于权限进行控制。

那么用户名和密码以及权限在哪存储呢?

在MySQL中,除了开发人员创建的业务库,还有支撑自己运行的系统库,包括mysql、sys、perfermance_schema、information_schema,用户信息就存储在mysql这个库。

在这里插入图片描述

当然,MySQL的连接数也是有限制的,这个可以通过max_connections参数控制。

MySQL [mysql]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1215  |
+-----------------+-------+

也可以通过 show processlist 查看当前连接的客户端。

MySQL [mysql]> show processlist;
+------+------+-----------------+-------+---------+------+----------+------------------+
| Id   | User | Host            | db    | Command | Time | State    | Info             |
+------+------+-----------------+-------+---------+------+----------+------------------+
| 1156 | root | 127.0.0.1:61223 | mysql | Query   |    0 | starting | show processlist |
+------+------+-----------------+-------+---------+------+----------+------------------+

2、查询缓存

当成功建立连接后,客户端就可以向MySQL服务发送sql语句了,「SQL接口」就像我们写的Controller一样会接收到sql语句,如果是 select 语句,将会去「缓存」中检索结果响应给客户端。

有些博客的说法是在解析后才查询缓存,这种说法是不严谨的,这里抛出官方的说明“如果收到相同的语句,服务器将从查询缓存中检索结果,而不是解析并再次执行该语句”

在这里插入图片描述

同时在该说明中可以看到“从MySQL 5.7.20开始,查询缓存已被弃用,并在MySQL 8.0中被删除。”这个注释。按照官方的说法是“缓存只适用于表数据不会经常变动的场景,如果表数据经常更新(很明显大多是这个场景),缓存命中率低下,加上频繁的维护缓存,有时候造成的问题比解决的问题还要多,缓存的功能就显得比较鸡肋了。

3、解析SQL语句

在经过缓存后,就由「解析器」开始工作了,解析器的目的是检查sql语句是否正确以及将sql语句解析成MySQL能够理解的结构,也就是sql语法树。

select1 id from table1 这条sql语句就会在解析时报错,因为没有识别到 select 这个关键字(对列名、表名的检查和验证是在预处理阶段)。

在这里插入图片描述

而像 select id from table1 这条sql语句会被解析成下图:

在这里插入图片描述

如果想了解具体的解析过程可以参考这篇博客

4、优化SQL语句

通过解析器生成sql语法树后就到了「优化器」阶段了,sql如何执行、使不使用索引、使用哪个索引都是在这个阶段处理,《MySQL优化的底层逻辑》中有写到,这里不过多赘述。

5、执行SQL语句

经过「优化器」后最终生成一个最优的执行计划交给「执行器」来执行,执行器通过调用「存储引擎」的接口来获取数据,这里先不展开执行器与存储引擎的交互,后面的文章会详细阐述一下。

总结

至此,一条查询语句的执行流程已经非常清晰了,同时也认识了MySQL的整个体系结构以及各组件的作用。最后用一张图来收尾本文的核心内容并做总结。

在这里插入图片描述

一条查询SQL语句的执行流程:

  1. 客户端通过连接器连接MySQL服务。
  2. 连接成功后向SQL接口发送SQL语句请求。
  3. SQL接口接收到SQL查询语句会先去缓存查询,如果命中返回给客户端,否则交给解析器。
  4. 解析器在拿到SQL语句后会判断语法是否正确,正确会生成sql语法树交给优化器,否则报错给客户端。
  5. 优化器会根据sql语法树生成一个最优的执行计划交给执行器执行。
  6. 执行器拿到执行计划调用存储引擎来获取数据响应给客户端。
  7. 完成!!!

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

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

相关文章

【深度学习】因果推断与机器学习

2023年初是人工智能爆发的里程碑式的重要阶段,以OpenAI研发的GPT为代表的大模型大行其道,NLP领域的ChatGPT模型火爆一时,引发了全民热议。而最新更新的GPT-4更是实现了大型多模态模型的飞跃式提升,它能够同时接受图像和文本的输入…

计算机组成原理-固态硬盘SSD

文章目录 总览机械硬盘vs固态硬盘固态硬盘的结构固态硬盘与机械硬盘相比的特点磨损均衡技术例题 总览 机械硬盘vs固态硬盘 固态硬盘采用闪存技术,是电可擦除ROM 下图右边黑色的块块就是一块一块的闪存芯片 固态硬盘的结构 块大小16KB~512KB 页大小512B~4KB 对固…

BUUCTF [MRCTF2020]ezmisc 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 感谢Galaxy师傅供题。 密文: 下载附件,解压得到.png图片。 从这里也可以看出图片经过修改,无法正常显示。 解题思路: 1、在010 E…

PyQt6运行QTDesigner生成的ui文件程序

2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~、第2讲 PyQt6库和工具库Q…

CH01_适应设计模式

Iterator模式(迭代器模式) 迭代器模式(Iterator),提供一种方法,顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。 类图结构 说明 Iterator(迭代器) 该角色负责定义按…

2023.11.25更新关于mac开发APP(flutter)的笔记与整理(实机开发一)

我自己写的笔记很杂,下面的笔记是我在chatgpt4的帮助下完成的,希望可以帮到正在踩坑mac开发APP(flutter)的小伙伴 目标:通过MAC电脑使用flutter框架开发一款适用于苹果手机的一个APP应用 本博客的阅读顺序是&#xf…

1、分布式锁实现原理与最佳实践(一)

在单体的应用开发场景中涉及并发同步时,大家往往采用Synchronized(同步)或同一个JVM内Lock机制来解决多线程间的同步问题。而在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题&…

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录 前言一、自定义条件编译平台是什么?二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…

inBuilder低代码平台新特性推荐-第十期

各位知乎的友友们,大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第十期——查看变更日志 场景介绍 【销售订单列表】中添加查看变更日志按钮,可以查看列表当前行数据的历史变更记录。 运行时效果 概念 系统中有些关键业务关键数据&am…

学习ComplexHeatmap复杂热图

iMeta | 复杂热图(ComplexHeatmap)可视化文章最新版,画热图就引它_生信宝典的博客-CSDN博客 作者贡献 顾祖光:研究课题的提出和设计, 软件编写,可视化,数据分析,论文编写,修订和审阅。 代码和…

【教3妹学编程-算法题】二叉树中的伪回文路径

3妹:好冷啊, 冻得瑟瑟发抖啦 2哥 : 又一波寒潮来袭, 外面风吹的呼呼的。 3妹:今天还有雨,2哥上班记得带伞。 2哥 : 好的 3妹:哼,不喜欢冬天,也不喜欢下雨天,要是我会咒语…

你听过斯大林病毒吗?

相信不少小伙伴看过这种红眼特效,那么你知道这个特效最早出自哪里吗? 其实这个红眼病毒最早出于俄罗斯的电脑病毒斯大林,一旦电脑感染这个病毒,屏幕上就会出现自带一个红眼特效的斯大林人像,同时不断播放苏联国歌。 …