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 已废弃该功能),原因如下:
- 对于一些静态数据,前置到本地缓存或分布式缓存效果更佳;
- 对于经常变化的数据,只要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
参考: