首页 > 数据库 >一条 SQL 语句在 MySQL 中的执行过程

一条 SQL 语句在 MySQL 中的执行过程

时间:2024-12-13 22:22:07浏览次数:8  
标签:语句 解析 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,执行
From: https://www.cnblogs.com/eiffelzero/p/18605996

相关文章

  • MySQL 的 Change Buffer 是什么?它有什么作用?
    MySQL的ChangeBuffer1.什么是ChangeBuffer?ChangeBuffer是MySQLInnoDB存储引擎中的一个优化机制,用于减少磁盘I/O操作。它是一个专门用来缓存非唯一二级索引变更操作的内存区域,位于InnoDB的BufferPool中。当对非唯一二级索引执行插入、更新或删除操作时,MySQL......
  • 【MySQL数据基础】
    目录一、数据库概述1、数据库介绍2、数据库分类3、常见数据库介绍4、小结二、MySQL数据库1、MySQL介绍2、MySQL的特点3、MySQL版本4、MySQL数据库下载与安装5、添加环境变量(Windows)6、检测环境变量是否配置成功三、Linux系统下的MySQL安装与使用1、MySQL安装与使......
  • 【MySQL中多表查询和函数】
    目录1.多表查询1.1外键1.2链接查询2.MySQL函数内置函数简介数值函数字符串函数时间日期函数条件判断操作开窗函数1.多表查询本质:把多个表通过主外键关联关系链接(join)合并成一个大表,在去单表查询操作1.1外键外键概念:在从表(多方)创建一个字段,引用主表(一方)......
  • [免费]SpringBoot+Vue疫苗接种预约管理系统【论文+源码+SQL脚本】
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue疫苗接种预约管理系统,分享下哈。项目介绍如今的时代,是有史以来最好的时代,随着计算机的发展到现在的移动终端的发展,国内目前信息技术已经在世界上遥遥领先,让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯......
  • JS-16 循环语句之for
    循环语句用于重复执行某个操作for语句是循环命令,可以指定循环的起点,终点和终止条件。他的格式如下for(初始化表达式;条件;迭代因子){语句}for语句后面的括号里面,由三个表达式。①初始表达式(initialize):确定循环变量的初始值,只在循环开始时执行一次。②布尔表达式(test):每轮循......
  • Scala语句 IF...ELSE
    ScalaIF...ELSE语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。可以通过下图来简单了解条件语句的执行过程:if语句if语句有布尔表达式及之后的语句块组成。语法if语句的语法格式如下:if(布尔表达式){//如果布尔表达式为true则执行......
  • JS-14 条件语句之switch
    多个if...else连接在一起使用的时候,可以转为使用更方便的switch结构表达式→值1→语块1→break;→表达式→值2→语块1→break;→表达式→defalut→默认语块→switch(fruit){case"banana"://...break;case"apple"://...default://...}需要注意的......
  • 使用分页插件完成分页查询,mybatis完成多对一联表,mybatis完成一对多联表,动态sql
    1.使用分页插件完成分页查询1.引入依赖<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.3</version></dependency>2.在mybatis.xml里面配置<plugins><!......
  • MySQL-基础-多表查询
    多表关系概述项目开发中,再进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)    案例:部门与员工的关系         ......
  • 分支语句——if、switch
    问题:VS2019使用scanf函数报错方法:宏定义define#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>//分支语句if语句intmain(){ intage=17; if(age<18) {printf("未成年\n");  printf("不能谈恋爱\n");}else {if(age>=18&&ag......