一条 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 ...
随机推荐
- ESP32 idf常用脚本命令及git命令
一.Linux环境 1.下载并安装相关的工具 ./install.sh 2.添加ESP-IDF工具到PATH中 . ./export.sh 3.打开配置界面 idf.py menuconfig 4.设 ...
- mysql异常处理的收集
今天在处理mysql的存储过程,判断游标是否到了结尾,结果让返回零行的一个查询触发了,随即从网上查阅资料收集异常异常处理. MySql错误处理(一)- SQL服务器模式 导言:MySql错误处理的基础 ...
- Transaction rolled back because it has been marked as rollback-only问题解决
1.背景 在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法.比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事务,这个方法 ...
- 让AI碰撞!“天翼云息壤杯”高校AI大赛江苏赛区交流会热力开场!
由中国电信集团有限公司主办,天翼云科技有限公司承办的"天翼云息壤杯"高校AI大赛正在火热进行中.为了提高江苏赛区学生的参赛热情,增强学生的创作能力,江苏电信.天翼云华东中心于12月 ...
- Typecho获取当前页面加载完成速度时间
判断当前页面加载是否快速,通常是直接在浏览器中访问网站,看自己的直观感受是否快速.而客观的方法则是计算具体的页面加载时间并显示出来给看. 1.在当前主题的functions.php文件添加下面的代码: ...
- Go实现动态开点线段树
1.线段树介绍 线段树是一种用于高效处理区间查询和区间更新的数据结构,当我们需要解决一个频繁更新区间值的问题的时候,就可以采用线段树的结构进行解决.线段树的核心思想是将区间分为多个子区间进行管理,越往 ...
- 普通文本(.txt)篇章排版样式参考 [文档说明][日志]
把普通文本的篇章排版样式归总一下,供自己参考,当然如果读者能以此借鉴并学习到一些东西,是笔者最大的鼓励. 日志类 [1] 头标 [时间日期][备注][属性]内容 [2] [文件信息][符号][文件信息 ...
- Hi3516EV200 编译环境配置及交叉编译软件包
基础信息 OS: Ubuntu 16.04 xenial SDK 版本: Hi3516EV200R001C01SPC012 - Hi3516EV200_SDK_V1.0.1.1 SDK 包路径:Hi3 ...
- 深入理解C++ 空类大小
在C++中,规定空类(即类中没有任何数据成员.成员函数.虚函数等成员的类)的大小为1字节,这背后主要有以下几方面的原因: 保证对象的唯一性和可区分性 在C++的面向对象编程模型中,对象是类的实例化结果 ...
- SpringCloud带你走进微服务的世界
认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打 ...