SQL语句执行过程

SQL执行过程

  SQL 语句在 MySQL 中的流程是:SQL 语句→缓存查询→解析器→优化器→执行器,如下图所示:
在这里插入图片描述

连接器

作用: 身份认证、权限校验、连接管理、以及安全管理;

半双工通信

  MySQL客户端与服务端的通信方式是“半双工通信”,即客户端与服务端是双向通信,但是发送和接受不能同时进行,同一时刻只能要么发送要么接受数据;

查看连接
SHOW PROCESSLIST;

在这里插入图片描述
Id:连接id;
db:连接使用的数据库名称;
Command:线程正在执行的命令类型;

  • Sleep:线程正在等待客户端发送命令;
  • Query:线程正在执行查询;
  • Locked:线程正在等待锁释放;
  • Sorting Data:线程正在对结果排序;
  • Sending Data:线程正在给客户端返回数据;

Time:线程在当前状态的时间,单位秒;
State:线程的状态;
Info:线程执行的命令;

查询缓存(不推荐)

  缓存可看做KV形式的存储,SQL作为key,查询结果作为value。不过在MySQL中不推荐开启查询缓存(MySQL8.0 已废弃该功能),原因如下:

  1. 对于一些静态数据,前置到本地缓存或分布式缓存效果更佳;
  2. 对于经常变化的数据,只要MySQL表中有数据发生变化,与这张表相关的缓存都会失效,缓存效率不高;

执行器

查看执行计划EXPLAIN

在这里插入图片描述
id:执行计划id,标识执行顺序,id越大优先级越高,越被优先执行,如果id相同则从上到下执行;
select_type:查询类型,用于区分普通查询、子查询和联合查询等;

  • SIMPLE:简单查询,不包含子查询和联合查询;
  • PRIMARY:子查询的最外层部分;
  • SUBQUERY:select或where列表中的子查询;
  • MATERIALIZED:in后面的子查询;
  • UNION:联合查询;

possible_keys:可能使用到的索引;
key:实际使用的索引;
key_len:实际使用的索引的长度;
rows:涉及到的行数(预估值);
filtered:实际返回的结果与rows的比例,越接近100越好,说明数据越有效;
Extra:十分重要的额外信息;

  • using filesort:没有使用基于索引的排序,而是使用了文件外数据排序;
  • using temporary:使用临时表,常见于联合查询、结果排序的场景;
  • using index:表示使用了索引;
  • using where:表示使用了where过滤条件;

type: SQL查询优化的重要指标,从好到坏依次是system > const > eq_ref > ref > range > index > all

参考:

  1. SHOW PROCESSLIST Statement
  2. EXPLAIN Output Format
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值