一条 SQL 语句在 MySQL 中的执行过程
一条 SQL 语句在 MySQL 中的执行过程
当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析、优化、执行等。以下以 SELECT 语句为例,详细描述整个执行流程。
1. 客户端与服务器连接
- 客户端通过 TCP/IP、Unix socket 等协议与 MySQL 服务器建立连接。
- MySQL 服务器验证客户端身份(用户名、密码)并检查权限。
- 为每个连接分配线程,后续的 SQL 请求由该线程处理。
2. 查询接收与初步处理
- MySQL 接收到来自客户端的 SQL 语句后,将其送入 SQL 层。
- 此时,SQL 语句只是一个字符串,需要进行进一步处理。
3. 查询解析
语法解析
MySQL 使用解析器对 SQL 语句进行语法检查,验证语句格式是否正确。
如果有语法错误,立即返回错误信息。
语义解析
检查:
- 表、列等数据库对象是否存在。
- 用户是否拥有相关权限。
解析完成后,MySQL 会生成一棵 解析树。
4. 查询优化
MySQL 的优化器负责根据解析树生成最优的执行计划。优化过程包括以下步骤:
(1)表的访问顺序
- 对于多表查询,决定表的连接顺序。
- 优化器基于表的大小、关联条件等生成访问顺序。
(2)索引选择
- 判断是否有合适的索引可以利用。
- 选择索引时考虑索引类型(主键索引、二级索引)、选择性等。
(3)查询重写
- 将子查询优化为 JOIN 或其他高效的操作。
- 进行谓词下推(将过滤条件尽量推到存储引擎层)。
(4)成本估算
- 基于统计信息(如表的行数、索引选择性等)计算每种方案的成本。
- 选择最低成本的执行计划。
优化完成后,MySQL 会生成一个 执行计划。
5. 查询执行
(1)存储引擎层执行
- 根据执行计划,存储引擎负责实际的数据读取操作。
- 如果有索引:存储引擎通过索引快速定位数据。
- 如果无索引:存储引擎执行全表扫描。
(2)SQL 层操作
SQL 层基于存储引擎返回的数据进行进一步处理:
- 执行过滤操作(如 WHERE 条件)。
- 处理排序(ORDER BY)、分组(GROUP BY)或聚合函数。
- 如果有分页(LIMIT),提取符合条件的记录。
(3)使用临时表
当查询涉及复杂操作(如排序、分组等)时,MySQL 可能会创建临时表存储中间结果:
- 小型临时表存放于内存中。
- 大型临时表会写入磁盘。
6. 返回结果
MySQL 将最终处理结果返回给客户端:
- 如果是查询操作(SELECT),返回数据行。
- 如果是修改操作(INSERT/UPDATE/DELETE),返回受影响的行数。
7. 示例:SQL 执行流程
假设执行以下 SQL:
SELECT name, age FROM users WHERE age > 30 ORDER BY age DESC LIMIT 5;
具体流程:
1. 解析:
- 检查
users表和name、age列是否存在。 - 验证语法,生成解析树。
2. 优化:
- 选择合适的索引(如
age列上的索引)。 - 确定过滤条件、排序和分页的执行顺序。
3. 执行:
- 存储引擎扫描满足
age> 30 的记录。 - SQL 层对记录按
age降序排序,并提取前 5 条。
4.返回:
- 将查询结果返回给客户端。
总结
一条 SQL 语句的执行过程可以总结为以下几个步骤:
1.连接建立:客户端与服务器建立通信。
2.解析语句:检查语法和语义,生成解析树。
3.优化查询:生成最低成本的执行计划。
4.执行计划:存储引擎读取数据,SQL 层处理结果。
5.返回结果:将最终结果发送回客户端。
整个流程体现了 MySQL 从解析到执行的高效协作。
一条 SQL 语句在 MySQL 中的执行过程的更多相关文章
- 一条 SQL 语句在 MySQL 中如何执行的
一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...
- 一条SQL语句在MySQL中如何执行
一条SQL语句在MySQL中如何执行 本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会 ...
- 一条SQL语句在MySQL中如何执行的
本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...
- 一条SQL语句在MySQL中是如何执行的
概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...
- sql语句在Mysql中如何执行?
1.MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器.查询缓存.分析器.优化器.执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redo ...
- 一条查询语句在MySQL中是如何执行的?
前言 我们在学习一种技术的时候,首先要鸟瞰其全貌,千万不要一开始就陷入到细节中去,这样有助于我们站在高维度其理解问题 —— 丁奇. 学习MySQL也是一样,所以我们可以从一条查询语句的执行开始看起. ...
- 原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》
前言 看到蒋老师的第一篇文章后就收货颇丰,真是句句戳中痛点. 令我记忆最深的就是为什么知道了一个个技术点,却还是用不好 ?不管是蒋老师所说的Redis还是本系列要展开学习的MySQL. 这是一个值得思 ...
- 使用PowerDesigner创建物理模型并生成SQL语句在MySQL中生成表
我使用的PowerDesigner的版本为16.5,创建物理模型后,使用PowerDesigner生成的SQL语句,在MySQL中创建表. 1. 打开Power Designer软件,在弹出的欢迎对话 ...
- sql语句(mysql中json_contains、json_array的使用)
https://blog.csdn.net/qq_35952946/article/details/79131488 https://www.jianshu.com/p/455d3d4922e1 1. ...
- SQL语句在数据库中可以执行在mybatis执行不了
这个问题竟然纠结了半个小时! 就问题而言,肯定是出在mybatis中 终于,找到了答案, 原来是DataSource配置问题, 我将配置连接池的数据写到了文件db.properties中, SqlMa ...
随机推荐
- Python代码将大量遥感数据的值缩放指定倍数的方法
本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像文件的方法. 首先,看一下本文的具体需求.我们现有一 ...
- mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处理
周末突然接到一位一年多没联系的妹妹打来电话,"刘哥,快来救救我",我脑海瞬间冒出妙瓦底,电信火苲马扁.....,当时就冒汗了,心想这个妹子怎么被... 问其原由,原来是他们公司服务 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 独立开发经验谈:如何借助 AI 辅助产品 UI 设计
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统.陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营 ...
- 一键部署Palworld幻兽帕鲁服务器最佳实践
本文基于天翼云通用型云主机,为您介绍通过镜像一键部署Palworld幻兽帕鲁服务器的具体操作. Ubuntu系统 1.按需购买云主机.通过Palworld专属活动优惠页一键购买开通云主机. 根据需要选 ...
- Java中int、Integer、long、Long、double、Double和BigInteger的关系
Java中int.Integer.long.Long.double.Double和BigInteger的关系 在Java中,int.Integer.long.Long.double.Double和Bi ...
- 用 just 简化项目命令管理
在软件开发过程中,高效管理项目命令是提升开发效率的关键, 它们可以帮助我们自动化重复的任务,简化项目管理流程,提高效率. 今天,我们来介绍一个名为 just 的任务运行器. 它由 Casey 发起,用 ...
- [QOJ8672][PKUSC2024] 排队
函数复合,直接转化为离线问题,那我们就需要完成对满足条件的量的区间加操作. 显然 \(ans_{[l,r]}\ge ans_{(l,r]}\),所以可以线段树二分. 时间复杂度 \(O(q\log n ...
- LINUX 服务器安装nginx redis jdk等步聚
1.安装指令步聚 sudo yum update 更新linux系统 yum install -y nginx 安装nginx systemctl enable nginx 设置开机启动nginx s ...
- linux下安装 elasticsearch
一.基础环境 操作系统环境:Red Hat Enterprise Linux Server release 6.4 (Santiago) ES版本:elasticsearch-7.8.0-linux- ...