MySQL SQL的完整处理流程

专栏持续更新中:MySQL详解

一、sql执行流程分析

一条sql从客户端发起,在mysql中经过了一系列的流程,归结为如下图所示:

客户端提交一条sql语句,先在查询缓存中查询,如果缓存没有命中,将会进行查表操作。查表的流程总结过为如下:

(1)将sql交给解析器处理,生成一个解析树。 (2)预处理器会处理解析器,重新生成一个解析器,这个过程中将会改写sql。 (3)改写后的解析器交给查询优化器,查询优化器生成sql的执行计划。 (4)执行计划交给执行引擎调用存储引擎的的API接口,查询数据。 (5)最终的结果由执行引擎返回给客户端,如果看,开启查询缓存的话将会返回给客户端。

二、sql执行顺序总结

  1. FROM <left_table>
  2. <join_type> JOIN <right_table>
  3. ON <join_condition>
  4. WHERE <where_condition>
  5. GROUP <group_by_list>
  6. WITH {CUBE|ROLLUP}
  7. HAVING <having_condition>
  8. SELECT
  9. DISTINCT <select_list>
  10. ORDER BY <order_by_list>
  11. LIMIT <limit_number>

三、查询优化器与执行计划

1、查询优化器

查询优化器的主要作用是用来生成sql的执行计划,查询优化器是数据库的核心大脑所在,从某种意义上来说,优化sql,本质是理解优化器的执行行为。在mysql中优化的依据是sql的执行成本,执行计划的生成是基于成本的,成本的决定是依据sql的执行行数。优化器工作的前提是了解数据,工作的目的是解析数据,生成执行计划。

2、查询优化器执行过程

如上图所示:

  1. 查询优化器有语法分析,词法分析,语义检查等过程。
  2. 预处理阶段(查询改写)
  3. 查询优化阶段:主要有逻辑优化,物理优化。
    3.1. 逻辑优化 :把sql交给查询优化器之后,会根据生成的解析树,对sql做一些改写操作。
    3.2. 物理优化;过程是优化器生成获取数据去扫描数据的路径。
  4. 查询优化器优化依据,来自于代价估算器估算结果(它会调用统计信息作为计算依据)
  5. 交由执行器执行。

四、查看和干预sql执行计划

  1. 执行计划

查看执行计划可以采用explain关键字。

sql 复制代码
EXPLAIN  SELECT * from addr_longxi

当我们发现sql的执行计划不合理时,可以通过添加索引和强制驱动表的顺序,通过hints方式干预sql的执行计划。另外,mysql优化器的一些参数也可以进行修改,来控制优化器的一些行为。

  1. 优化器开关
sql 复制代码
·show variables like 'optimizer_switch
  1. Processlist

另一种观测MySQL行为的常用手段就是Processlist。通过Processlist,我们可以看到当前在MySQL中执行的所有SQL语句,有没有异常的会话或比较特殊的SQL状态。查看会话操作可以通过2种途径:

第一,show full processlist;

第二,information_schema.processlist。

常见异常行为有:

  1. Coping to tmp table:出现在某些Alter Table语句的Copy Table操作.
  2. Copying to tmp table on disk:由于临时结果集大于tmp_table_size 将临时表中的数据转换到磁盘中
  3. Converting HEAP to MyISAM:线程正在从内部内存临时表到磁盘MYISA临时表
  4. Creating sort index:正在使用内部临时表处理Select查询。
  5. Sorting index:磁盘排序操作的一个过程。
  6. Sending data:将结果正在发送给客户端。
相关推荐
Cx330❀3 小时前
【MySQL基础】一文吃透“表的约束”:从 Null/Default 到主外键的终极安全法则
linux·服务器·数据库·c++·mysql·安全
c238563 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
大阳光男孩3 小时前
Spring Boot 整合 Debezium 实现 MySQL 增量数据监听(嵌入式版)
spring boot·后端·mysql
我科绝伦(Huanhuan Zhou)3 小时前
MySQL极端场景数据丢失防护:从Crash-Safe到异地备份
数据库·mysql
皮皮林5513 小时前
ThreadLocal 不香了?ScopedValue才是王道?
后端
辞旧 lekkk3 小时前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
明志数科4 小时前
人形机器人格斗场景下的技术挑战:动力学控制、感知融合与实时决策
网络·数据库
酉鬼女又兒4 小时前
零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南
大数据·网络·数据库·人工智能·macos·机器人·github
笨蛋不要掉眼泪4 小时前
MySQL架构揭秘:MVCC解决读一致性问题
数据库·mysql·架构
X-⃢_⃢-X4 小时前
一、第一阶段:认识 Spring Boot
java·spring boot·后端