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:将结果正在发送给客户端。
相关推荐
一屉大大大花卷39 分钟前
初识Neo4j之入门介绍(一)
数据库·neo4j
wuxuanok1 小时前
Web后端开发-分层解耦
java·笔记·后端·学习
周胡杰1 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
31535669131 小时前
ClipReader:一个剪贴板英语单词阅读器
前端·后端
wkj0011 小时前
navicate如何设置数据库引擎
数据库·mysql
ladymorgana1 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
赵渝强老师1 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头1 小时前
Oracle注释详解
数据库·oracle
neoooo2 小时前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
御控工业物联网2 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http