MySQL学习之一条SQL查询语句的执行

news2025/1/20 1:56:47

文章目录

  • 前言
  • 一、MySQL基础架构
  • 二、连接器
  • 三、查询缓存
  • 四、分析器
  • 五、优化器
  • 六、执行器


前言

今天我们通过一条SQL查询语句的执行过程,来剖析MySQL的基础架构。让我们从宏观上先有一个对MySQL的认识与了解


一、MySQL基础架构

首先,我们要对MySQL的整体架构了解下,然后才能对每个部分进行突破。
MySQL的整体架构示意图如下:
在这里插入图片描述
由图可以看出,MySQL大体分为Server层和存储引擎层两部分。
其中,Server层包括连接器、查询缓存、分析器、优化器、执行器等。对于所有的内置函数(如日期、时间、数学和加密函数等),所有的跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取,默认使用的引擎是InnoDB。

对整体架构有了连接之后,接下来我们深入学习下每个组件的具体作用

二、连接器

连接器负责跟客户端建立连接、获取权限、维持和管理连接。
连接命令如下:

mysql -h$ip -P$port -u$user -p密码

在完成TCP握手后,连接器就开始认证身份,此时会出现两种情况:

  • 用户或密码不对,就会收到“Access denied for user”的错误,然后客户端程序结束执行
  • 用户密码认证通过,然后连接器会到权限表里面查询所拥有的的权限,连接里面的权限判断逻辑都将会依赖此时读到的权限。即使用管理员账号对这个用户权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置

连接完成后,我们可以通过如下命令:

show processlist;

来查看每个连接的状态
在这里插入图片描述
其中,Command列显示为“Sleep”的表示该连接为空闲连接。

如果长时间未使用这个连接,连接器就会自动断开。这个时间由参数wait_timeout控制,默认值是8小时。

此时断开之后,突然客户端如果发送请求时,就会收到错误提醒,如果真要发送请求只能重连然后再继续执行请求了。

对于说的这8小时,这么长,是不是想到了经常在写http或者tcp网络编程程序时听别人说的长连接啊。
在数据库里,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

建立连接的过程比较复杂,tcp三次握手,身份认证,权限认证等等操作,如果总是频繁的断开连接,建立连接,这就无可避免的增加了很多性能的损耗。因此为了避免这种损耗,尽量使用长连接。但是如果全部采用长连接,也会出现问题,有时候会导致MySQL占用内存涨的特别快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的,这些资源只会在连接断开的时候才释放,因此长连接长期的积累,肯定会导致内存占用变大。

为了解决这个问题,有两种方案可以采用:

  • 定期断开长连接,使用一段时间,或者程序里面判断执行过一个占用内存很大查询后,断开连接,之后要查询再重连
  • 可以在每次执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

了解完了连接器后,接下来再了解下查询缓存

三、查询缓存

MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。
之前执行过的语句及其结果可能以key—value的形式缓存在内存中,key是查询语句,value是对应的查询结果。
首先直接向缓存中查询一遍,看似比直接向磁盘中查询快。但是大多数情况下,不建议使用查询缓存,因为查询缓存往往弊大于利

因为如果我们对一个表更新,那么这个表上所有的查询缓存都会被清空,因此对于一个更新大的数据库来说,查询缓存的命中率会非常低。除非有一张静态表,很长时间才会更新一次,那这张表上的查询才适合使用查询缓存。

四、分析器

分析器会对SQL语句进行解析。
分析器主要会进行词法分析和语法分析
(确定要做什么)

五、优化器

这里主要介绍下优化器的主要工作。优化器是在表里有多个索引或者进行多表查询时,根据计算的时间成本,选择执行的索引或者查表的顺序,选择最优的操作,确定执行方案。
对于是怎么计算成本,进行方案选择的,可以看我写的那个mysql是怎么运行的里面有具体总结,也可以看后面的文章

六、执行器

执行器用于执行语句。
首先判断对这个表有没有执行权限,如果没有就返回没有权限的错误,如果有就打开表继续执行,打开表的时候会根据表的引擎定义,去使用这个引擎提供的接口。

接下来我们以这个查询语句为例(ID字段没有索引):

select * from T where ID=10;

执行器的流程如下:

  1. 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

对于有索引的表,执行逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

到此我们对,MySQL的基础架构有了初步了解。接下来我们将会对其内部原理进行深入的学习,请看后面博客更新

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入分析Linux PCI驱动框架分析(二)

说明: Kernel版本:4.14ARM64处理器使用工具:Source Insight 3.5, Visio 1. 概述 本文将分析Linux PCI子系统的框架,主要围绕Linux PCI子系统的初始化以及枚举过程分析;如果对具体的硬件缺乏了解&#xff…

详解c++---vector介绍

这里写目录标题什么是vectorvector的定义reservevector数据插入push_backinsertresizeassignvector数据的删除pop_backeraseclearvector性质查看sizecapacityemptymax_sizevector元素修改operator[ ]atfrontbackvector其他函数operatorswap什么是vector vector是表示可变大小数…

深入浅出Cookie、Session、Token:背后的技术原理

目录 简介 . 网站交互体验升级 1.1 无状态的 HTTP 协议 1.2 解决之道 2. Cookie方案 2.1 Cookie 定义和作用 2.2 服务端创建 Cookie 2.4 存在的问题 3. Session 方案 3.1 Session 机制的概念 3.2 简单的交互流程 3.3 Session 的实现方式 3.4 存在的问题 4. Token…

【微服务】Nacos 认证机制

目录 一、背景 二、需求 三、方案 1、安全架构选型 2、会话管理 2.1、会话选型 2.2、Session 登录流程 2.3、Token 登录流程 2.4、jwt 框架选型 2.5、会话超时 3、SSO 支持 4、UI设计 5、接口设计 6、数据库表设计 6.1、user表 6.2、roles表 7、Filter 拦截请求…

C++ —— 模板的基本概念和使用

目录 1.函数模板是什么 1.1函数模板的基本概念 1.2函数模板的基本使用 1.3函数模板的特化 1.4非类型模板参数 2.类模板是什么 2.1类模板的基本使用 2.2非类型模板参数 2.3类模板的特化 2.4模板特化后的优先级 3.函数模板不要分离编译 1.函数模板是什么 模板是一种…

python和MySQL的基础使用和数据的插入导出

一.基础使用第三方库pymysql除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库。在Python中,使用第三方库:pymysql来完成对MySQL数据库的操作。安装创建到MySQL的数据库链接具体代码如下from pymysql import Connect #获取到MySQL数…

LVS+Keepalived+Nginx宏观整体结构与关键问答

视频链接:4-2 为什么要使用 LVS Nginx?_哔哩哔哩_bilibili ———————————————————————————————————————————————————————— 1. 问题: 为什么要使用LVS Nginx?&#xf…

C语言刮刮乐(掩码图的范例)

程序简介 这个程序模拟了刮刮乐的刮卡操作,按下鼠标左键并移动可以刮开刮卡层。 刮卡操作是通过掩码图实现的,一张隐藏的待刮开背景图,一张掩码图。 刮卡的时候,是在黑色的掩码图上画线,显示的时候,通过…

官方正品 | Ultralytics YOLOv8算法来啦(尖端SOTA模型)

🚀🚀🚀卷王之王 | Ultralytics YOLOv8 算法来啦!!✨✨✨ 一、前言简介 🎄🎈 📚 代码地址:卷王之王 | YOLOv8代码下载地址 📚 详细文档:https://…

代码随想录算法训练营第十四天字符串 java :二叉树理论基础 144前序遍历 145后续遍历94 中序遍历

系列文章目录 第十一天笔记 文章目录系列文章目录前言1、二叉树理论基础1.1二叉树的种类1.1 如何区分二叉树的遍历方式1.2 如何定义二叉树节点2 递归遍历2.1**前序遍历 AC代码**2.2**后序遍历 AC代码**2.3 **中序遍历 AC代码**3 迭代法4 层次遍历总结**什么是List<List <…

组态王软件与S7-1200无线MODBUS通信方案详解

本方案是组态软件与西门子 S7-1200进行无线 MODBUS 通信的实现方法。此方案可以作为西门子 S7-1200与组态软件的无线 MODBUS 通信实例。在本方案中采用了西门子PLC专用无线通讯终端DTD434MC&#xff0c;作为实现无线通讯的硬件设备。 一、方案概述 组态王配置为标准 MODBUS 主…

基础面试问题

在Java中获取当前的工作目录System.getProperty("user.dir")public class Test {public static void main(final String[] args) {final String dir System.getProperty("user.dir");System.out.println("current dir " dir);} }获取一定范围…

Redis01之Windows版本的Redis安装配置

目录 0. 学习网址 https://www.w3cschool.cn/redis/https://www.w3cschool.cn/redis/ 1. Redis简介 2. 下载 3. 安装和配置 3.1 window(略...) 3.2 linux(CentOS) 4. Redis支持五种数据类型 5.通过命令操作redis 0. 学习网址 https://www.w3cschool.cn/redis/http…

一文搞懂CPU如何控制I/O设备

1 接口和设备&#xff1a;经典适配器模式 输入输出设备不只是一个设备。大部分输入输出设备&#xff0c;都有&#xff1a; 它的接口&#xff08;Interface&#xff09;实际的I/O设备&#xff08;Actual I/O Device&#xff09; 硬件设备并非直接接入到总线上和CPU通信&#…

UOS 录制电脑播放的音频 / 内录音频

Windows 里面有一个“立体声混音”&#xff0c;可以内录电脑播放的音频&#xff0c;而不受到外界噪音的干扰。前段时间接到反馈说 UOS 的设置里面的音频输入里面没有可以选择的设备&#xff0c;这里就稍微探索了一下&#xff0c;发现 UOS 也是可以配置内录的。这里参考了一下这…

网络基础(一)

网络基础&#xff08;一&#xff09;计算机网络背景网络发展独立模式: &#xff08;计算机之间相互独立&#xff09;网络互联: ( 多台计算机连接在一起, 完成数据共享)局域网LAN: (计算机数量更多了, 通过交换机和路由器连接在一起);广域网WAN: &#xff08;将远隔千里的计算机…

vue入门到精通(一)

一、vue简介 Vue是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 二、vue3选项式…

Linux编译器-gcc/g++使用

目录 1. 背景知识 2. gcc如何完成 2.1 预处理(进行宏替换) 2.2 编译&#xff08;生成汇编&#xff09; 2.3 汇编&#xff08;生成机器可识别代码&#xff09; 2.4 链接&#xff08;生成可执行文件或库文件&#xff09; 3 函数库 3.1 分类 3.2 图解 4 gcc选项 1. 背景知…

开源工具系列2:Trivy

在云原生安全的场景中&#xff0c;一个常见的场景就是对漏洞和配置进行扫描&#xff0c;以发现整个 K8s 环境的安全问题。今天我们来介绍一个高效的扫描工具Trivy。 Trivy 是什么 Trivy&#xff08;tri 发音为 trigger&#xff0c;vy 发音为 envy&#xff09;是一个简单而全面…

QT 学习笔记(十七)

文章目录一、多线程简介1. 基础知识2. 多线程的优缺点及注意事项二、多线程详解1. 背景案例2. 通过多线程对背景案例进行优化3. 方法一&#xff1a;多线程的创建使用&#xff08;QT 4.7 以前&#xff09;3.1 方法一的创建步骤3.2 方法一的具体实现及实现代码4. 方法二&#xff…