MYSQL——SQL语句到底怎么执行
查询语句执行流程
MySQL 查询语句执行流程

查询缓存(Query Cache)
MySQL内部自带了一个缓存模块,默认是关闭的。主要是因为MySQL自带的缓存应用场景有限。
- 它要求SQL语句必须一摸一样
- 表里面的任何一条数据发生变化时,该表所有缓存全部失效
在MySQL 5.8中,查询缓存已经被移除了。
语法解析和预处理(Parser & Preprocessor)
假如我们随便执行一个字符串 like SQL,服务器会报一个1064的错:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘fkdljasklf’ at line 1
服务器时怎么知道我输入的内容时错误的呢?
又或者,我输入一个语法完全正确的SQL,但是表名不存在, 它又是怎么发现的?
这就是MySQL的解析器(Parser)和预处理器(Preprocessor)。他们做的事情就是对SQL语句进行词法和语法分析和语义的解析。
词法分析
词法分析就是将一个完整的SQL语句打碎成一个个单词。
比如一个简单SQL语句:
select name from user where id = 1;
它会打碎成8个符号,记录每个符号是什么类型,从哪里开始到哪里结束。
语法分析
词法分析后,接下来就是语法分析。语法分析会对SQL做一些语法检查,比如单引号有无闭合,然后根据MySQL定义的语法规则,根据SQL语句生成一个数据结构,该数据结构我们称它为解析树。

预处理器(Preprocessor)
如果表名错误,会在预处理器处理时报错。
它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表名和列名是否存在,检查名字和别名,保证没有歧义。
查询优化(Query Optimizer)与查询执行计划
问题:一条SQL语句是不是只有一种执行方式?或者数据库最终执行的SQL是不是就是我们发送的SQL?
答案是否定的。一条SQL语句是可以又很多种执行方式的。但是若有这么多执行方式,这些执行方式怎么得到的?最终选择哪一种去执行?根据什么标准去选择的?
这就是MYSQL查询优化器干的事。
查询优化器的目的就是根据解析树生成不同的执行计划,然后选择一种最优的执行计划,MySQL里面使用的是基于开销(cost)的优化器,哪种执行计划开销最小,就用哪种。
-- 使用如下命令查询查询的开销
show status like 'Last_query_cost'; -- 代表需要随机读取一个 4k 的数据页才能完成查找
如果我们想知道优化器是怎么工作的,它生成了几种执行计划,每种执行计划的cost是多少,怎么做?
查看优化器得到的执行计划
https://dev.mysql.com/doc/internals/en/optimizer-tracing.html
首先我们要启用优化器的追踪(默认是关闭的)
show variables like 'optimizer_trace';
set optimizer_trace = "enable=on";
注意:开启这开关是会消耗性能的。 因为它要把优化分析的结果写到表里面,所以不要轻易开启或者查看之后关闭它(on改成off)
接着,我们执行一个SQL语句,优化器会生成执行计划:
select t.tcid from teacher t,teacher_contact tc where t.tcid = tc.tcid;
此时优化器分析过程就会记录到系统表里面了,我们可查询
select * from information_schema.optimizer_trace\G
expanded_query是优化后的SQL语句。
considered_execution_plans 里面列出了所有的执行计划。
记得关掉它
set optimizer_trace="enabled=off"; -- 关闭优化器追踪
show variables like 'optimizer_trace'; -- 查看关闭结果
优化器可以做什么
MySQL优化器能处理那些优化类型呢?
- 当我们对多张表进行关联查询时,以哪张表的数据作为基准表
select * from user where a = 1 and b = 2 and c = 3,如果c = 3结果有100条,b=2结果有200条,a=1结果有300条,你觉得会先执行哪个过滤?- 如果条件里面存在一些恒等或恒不等式,是否可以移除
- 查询数据,能否直接从索引里面取到值
- count()、min()、max()函数,能否从索引里面直接取到值等
优化器得到的结果
优化器最终会把解析树变成一个查询执行计划,查询执行计划是一个数据结构。
这个执行计划是不是一定是不是最优的执行计划?不一定,因为MySQL也可能覆盖不到所有的执行计划。
MySQL提供了一个执行计划工具。我们在SQL语句前面加上EXPLAIN,就可以看到执行计划信息。
explain select name from user where id = 1;
更新语句执行流程
首先提个问题,您觉得索引会对更新语句生效嘛?或者对更新操作性能有影响嘛?
答案是肯定的,因为更新操作是包含查看操作的。也就是首先将更新数据查询出来放到内容,然后再内存中进行更新,最后写回磁盘。

- 客户端首先将SQL语句传入MySQL服务端
- 数据库服务器将
name = 666的数据查询出来放到内存,然后数据库服务告诉存储引擎,将name字段修改为涛哥 - 存储引擎将修改结果更新到数据库缓存中
- 存储引擎记录 redo log,并将这行记录状态置为prepare
- 存储引擎通知数据库服务,数据已修改,可提交事务
- 数据库服务将操作日志写入bin log中
- 通知存储引擎提交事务
- 将redo log里这个事务的相关记录状态置为commit状态
相关文章:
MYSQL——SQL语句到底怎么执行
查询语句执行流程 MySQL 查询语句执行流程 查询缓存(Query Cache) MySQL内部自带了一个缓存模块,默认是关闭的。主要是因为MySQL自带的缓存应用场景有限。 它要求SQL语句必须一摸一样表里面的任何一条数据发生变化时,该表所有缓…...
智能血压计WT2801芯片方案-BLE 5.0无线传输、高保真语音交互、LED显示驱动、低功耗待机四大技术赋能
在智能健康设备飞速发展的今天,血压计早已不再是简单的“测量工具”,而是家庭健康的“智能管家”。然而,一台真正可靠、易用、功能全面的血压计,离不开一颗强大的“核心芯片”。 今天,我们揭秘医疗级芯片WT2801的硬核实…...
基于51单片机的智能火灾报警系统—温度烟雾检测、数码管显示、手动报警
基于51单片机的火灾报警系统 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 由51单片机MQ-2烟雾传感ADC0832模数转换芯片DS18B20温度传感器数码管显示按键模块声光报警模块构成 具体功能:…...
【Java】Java 中不同类型的类详解
目录 Java 中不同类型的类详解一、基础类类型1. 普通类(Concrete Class)2. 抽象类(Abstract Class)3. 接口(Interface)4. 枚举类(Enum Class) 二、嵌套类与特殊类5. 内部类ÿ…...
指定运行级别
linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程: 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…...
解决playwright操作网页下拉菜单问题
一个通俗易懂的 Playwright Python 教程,教你如何操作网页的下拉菜单。我们会从基础开始,一步步讲解,并配上实际例子。 Playwright 操作网页下拉菜单教程(Python版) 什么是 Playwright? Playwright 是一个…...
Python标准库:sys模块深入解析
sys模块是Python标准库中一个非常重要的内置模块,它提供了与Python解释器及其环境交互的多种功能。本文将深入探讨sys模块的各个方面,帮助开发者更好地理解和利用这个强大的工具。 1. sys模块概述 sys模块提供了对由解释器使用或维护的变量的访问&…...
HOW - 实现 useClickOutside 或者 useClickAway
场景 在开发过程中经常遇到需要点击除某div范围之外的区域触发回调:比如点击 dialog 外部区域关闭。 手动实现 import { useEffect } from "react"/*** A custom hook to detect clicks outside a specified element.* param ref - A React ref object…...
加油站小程序实战教程10开通会员
目录 1 修改用户登录逻辑2 创建变量3 调用API总结 我们上一篇搭建了开通会员的界面,有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候,在页面加载完毕后调用API看用户是否已经开通会员了,如果未开通就…...
TorchServe部署模型-index_to_name.json
在TorchServe部署模型时,若要将模型输出结果映射到指定标签(如分类任务的类别名称),需通过index_to_name.json文件定义索引与标签的映射关系,并在打包模型时将其作为额外文件包含。以下是完整流程和命令示例࿱…...
Python 3.x cxfreeze打包exe教程
Python 3.x cxfreeze打包exe教程 https://blog.csdn.net/qq_33704787/article/details/123926953 去官网 下载安装 pip install cx-Freeze7.2.9 https://pypi.org/project/cx-Freeze/7.2.9/ 安装到 你的 python 的 script文件夹下面 (全局或是 虚拟环境都行&#x…...
Vue/React组件/指令/Hooks封装的基本原则以及示例
一、组件封装原则与示例 Vue组件封装 核心原则 • 单一职责:每个组件只解决一个功能(如分页、过滤表单) • Props控制输入:通过定义明确的Props接口接收外部数据(类型校验、默认值) • Emit事件通信:子组件通过$emit向父组件传递动作(如分页切换) • 插槽扩展性:使用…...
【蓝桥杯】15届JAVA研究生组F回文字符串
一、思路 1.这题去年考的时候想的是使用全排列进行尝试,实际不用这么麻烦,只用找到第一个和最后一个非特殊字符串的位置,然后分别向内检查是否对称,向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…...
SDL显示YUV视频
文章目录 1. **宏定义和初始化**2. **全局变量**3. **`refresh_video_timer` 函数**4. **`WinMain` 函数**主要功能及工作流程:总结:1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件 #define QUIT_EVENT...
没有他的“变换”,就没有今天的人工智能
从ChatGPT发布以来,大语言模型(LLM)是所有人追逐的方向,无论是将其看作“万能神”或是人工智能应用的基础构件,其重要性毋庸置疑。而随着大语言模型扩展到多模态领域,就需要更多的工具来帮助其进行处理。 例…...
el-input 中 select 方法使用报错:属性“select”在类型“HTMLElement”上不存在
要解决该错误,需明确指定元素类型为 HTMLInputElement,因为 select() 方法属于输入元素。 步骤解释: 类型断言:使用 as HTMLInputElement 将元素类型断言为输入元素。 可选链操作符:保持 ?. 避免元素为 null 时出错…...
MCP 实战:实现server端,并在cline调用
本文动手实现一个简单的MCP服务端的编写,并通过MCP Server 实现成绩查询的调用。 一、配置环境 安装mcp和uv, mcp要求python版本 Python >3.10; pip install mcppip install uv 二、编写并启用服务端 # get_score.py from mcp.server.fastmcp import…...
关于C++日志库spdlog
关于C日志库spdlog spdlog是一个高性能、易于使用的C日志库,广泛应用于现代C项目中。它支持多线程、异步日志记录、多种日志格式、以及灵活的输出方式(如控制台、文件、甚至自定义输出)。下面将就常用功能方面介绍spdlog的安装、配置和使用方…...
回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测
回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME…...
ruby self
在 Ruby 中,self 是一个指向当前对象的特殊变量,它的值根据代码的上下文动态变化。理解 self 的指向是掌握 Ruby 面向对象编程的关键。以下是详细解析: 一、self 的核心规则 self 始终指向当前方法的执行者(即调用方法的对象&…...
液氮恒温器是做什么的
液氮恒温器是一种利用液氮作为冷源的恒温装置,主要用于提供低温、恒温或变温环境,广泛应用于科研、工业和医疗等领域。液氮恒温器通过液氮的低温特性来实现降温效果,具有效率高、降温速度快、振动小、成本低等优点。 液氮恒温器应用场景和…...
突破,未观测地区罕见极端降雨的估计
文章中文总结(重点为方法细节) 一、研究背景与目的 在无测站或短观测记录地区,传统极值理论(如GEV)难以估计稀有极端降雨事件;本文提出一种新的区域化极值估计方法:区域化 Metastatistical Ex…...
`mpi4py` 是什么; ModuleNotFoundError: No module named ‘mpi4py
mpi4py 是什么 目录 `mpi4py` 是什么ModuleNotFoundError: No module named mpi4pyModuleNotFoundError: No module named mpi4py mpi4py 是一个 Python 模块,它提供了对 MPI(Message Passing Interface)标准的接口,使得 Python 程序能够利用 MPI 进行并行计算。其作用主要…...
大数据 - 1. 概述
早期的计算机(上世纪70年代前) 是相互独立的,各自处理各自的数据上世纪70年代后,出现了基于TCP/IP协议的小规模的计算机互联互通。上世纪90年代后,全球互联的互联网出现。当全球互联网逐步建成(2000年左右&…...
Java基础下
一、Map Map常用的API //map常用的api//1.添加 put: 如果map里边没有key,则会添加;如果有key,则会覆盖,并且返回被覆盖的值Map<String,String> mnew HashMap<>();m.put("品牌","dj");m.put("…...
数据结构和算法(十二)--最小生成树
一、有向图 定义: 有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。 出度: 由某个顶点指出的边的个数称为该顶点的出度。 入度: 指向某个顶点的边的个数称为该顶点的入度。 有向路径: 由一系列顶点组…...
TK广告素材优化:提升投放效果的核心策略
在广告投放领域,决定投放效果的三大关键要素是:产品、素材和人群。由于产品相对固定且人群多采用通投策略,因此素材质量成为影响投放效果的决定性因素。 为什么素材如此重要? 素材质量直接影响广告的点击率,进而影响…...
Python3笔记之号称替代pip的uv包管理器
uv是什么? uv,这是一个由 Astral 团队开发的极快速的Python包和项目管理工具,用Rust语言编写。它集成了多种功能,旨在替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等多个工具,提供更高效、更全面的Py…...
8.3.1 MenuStrip(菜单)控件
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 MenuStrip控件提供了程序窗体的主菜单,即显示于窗体顶端部分的菜单。 MenuStrip常用属性: ImageScalingSize…...
STM32单片机入门学习——第29节: [9-5] 串口收发HEX数据包串口收发文本数据包
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.09 STM32开发板学习——第29节: [9-5] 串口收发HEX数据包&串口收发文本数据包 前…...
