当前位置: 首页 > article >正文

mysql 查询语句的执行流程

1. 客户端发送查询
客户端通过 MySQL 客户端工具或应用程序将 SQL 查询发送到 MySQL 服务器。
查询通过网络传输到 MySQL 服务器。
MySQL 使用连接器(例如 JDBC、ODBC)接收查询。

2. 查询解析和优化流程
在 MySQL 服务器内部,查询会经过以下阶段:

(1)查询接收
查询由 连接器 接收,服务器检查用户权限,确保用户有权限执行该查询。
如果权限不足,会直接返回错误。

(2)查询缓存检查(可选,MySQL 8.0 开始默认禁用)
如果开启了查询缓存,MySQL 会检查缓存中是否有对应查询的结果。
如果缓存命中,直接返回缓存结果,跳过后续步骤。

(3)语法解析
MySQL 使用解析器(Parser)将查询解析为语法树。
解析器检查 SQL 语句的语法是否正确。
如果语法错误,返回错误信息。

(4)语义解析
检查语句中引用的表、列等对象是否存在,数据类型是否匹配。
检查用户是否有访问这些表或列的权限。

(5)查询优化
MySQL 优化器对查询语句进行优化:
选择执行计划:优化器根据查询语句的内容和表的统计信息,生成多个可能的执行计划(如选择使用索引、全表扫描等)。
选择最优计划:评估每种计划的成本(如 I/O 开销、CPU 开销),选择代价最低的计划。

优化器的重要工作包括:
重写查询语句(如将子查询转为 JOIN)。
确定表的访问顺序。
选择合适的索引。

3. 查询执行
优化器生成的执行计划交给执行器(Executor)执行。

(1)访问存储引擎
MySQL 的存储引擎负责具体的数据存储和读取操作。
根据查询计划,存储引擎执行如下操作:
读取表数据(可能通过索引或全表扫描)。
应用查询条件(如 WHERE 子句)。
进行数据过滤和排序。

(2)临时表处理(可选)
如果查询需要排序、分组或 JOIN 等操作,可能会使用临时表存储中间结果。
临时表可能存储在内存中,或者当数据量较大时,写入磁盘。

4. 返回结果
MySQL 将最终结果集返回给客户端。
数据可能通过网络传输,客户端工具会接收并展示结果。

关键组件和角色
以下是参与查询过程的主要组件:
连接器:管理客户端连接,验证用户权限。
查询缓存(可选):缓存查询结果,提高性能。
解析器和优化器:负责解析语句和选择执行计划。
执行器:按照优化器提供的执行计划执行查询。
存储引擎:负责数据的存储和检索。

总体流程图

客户端 -> 连接器 -> 查询解析器 -> 查询优化器 -> 执行器 -> 存储引擎 -> 执行结果返回客户端

示例
假设执行以下 SQL 语句:

SELECT name FROM students WHERE id = 123;

接收查询:连接器接收查询并验证权限。
语法解析:解析器检查语句语法是否正确(如 SELECT、WHERE 是否正确)。
语义解析:检查表 students 和列 name、id 是否存在。
优化查询:优化器决定是否使用索引,选择访问 students 表的最佳方式。
执行查询:
存储引擎查找 students 表中 id=123 的行。
提取该行的 name 列值。
返回结果:查询结果返回给客户端。

总结
MySQL 查询从接收到返回结果经历了 接收、解析、优化、执行、返回 五个主要阶段。理解这一过程可以帮助我们优化查询性能,例如通过添加索引、调整查询语句等措施,提高效率。


http://www.kler.cn/a/504507.html

相关文章:

  • 【Java】设计模式——代理模式
  • 【记录】篡改猴插件下载网页m3u8视频
  • 如何监控 Elasticsearch 集群健康状态并实现邮件自动预警?
  • R 语言科研绘图 --- 折线图-汇总
  • 代码随想录day03
  • 信息时代的消费者行为变迁与应对策略:基于链动2+1模式、AI智能名片及S2B2C商城小程序的分析
  • Spring Boot Web技术栈(官网文档解读)
  • Opencv之模板匹配可视化
  • Flutter:使用FVM安装多个Flutter SDK 版本和使用教程
  • java -jar启动项目报错:XXX.jar中没有主清单属性
  • 小游戏前端地区获取
  • Django基础之ORM初识
  • Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解
  • 长安“战疫”网络安全公益赛的一些随想
  • 基础理论知识:无人机图数传数据链技术详解
  • 多租户架构是什么?
  • 初学stm32 --- ADC采集内部温度传感器
  • 如何调整 Nginx 工作进程数以提升性能
  • 怎么实现Redis的高可用?
  • html中鼠标位置信息