explain 使用也很简单 , 直接在查询语句前面加上 explain 关键字即可:
EXPLAIN SELECT * FROM user where id = 1;

文章插图
从图中我们看到 MySQL 返回了一行记录 , 下面我们一起来分析每个字段代表什么含义
字段含义id一次查询过程中该条 select 语句的唯一标识select_type查询类型,共包含四种 simple、primary、subquery、derivedtable查询的是哪张表partitions表的分区信息type访问类型,分析性能主要通过该字段possible_keys可能会用到的索引key实际用到的索引key_len索引里使用的字节数ref这一列显示了在key列记录的索引中,表查找值所用到的列或常量rowsMySQL 预估的扫描行filteredMySQL 过滤后,满足条件记录数的比例Extra展示了一些额外信息5.2.2 Explain 详解1、id
id 是查询语句中的唯一标识,id 的值越大,该 id 对应的 sql 语句越先执行
explain select * from dept where id = (select dept_id from user where id = 1);

文章插图
从执行计划来看 , select dept_id from user where id = 1 这条语句先执行,因为外层查询需要借助这条查询语句的结果
2、select_type
查询类型,共包含四种
simple:简单查询 。查询不包含子查询和union

文章插图
primary:复杂查询中最外层的 select

文章插图
subquery:包含在 select 中的子查询(不在 from 子句中)

文章插图
derived:包含在 from 子句中的子查询 。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)
3、table
查询的是哪张表,比较好理解
4、partitions
查询时匹配到的分区信息,对于非分区表值为 NULL,当查询的是分区表时 , partitions 显示分区表命中的分区情况 。
5、type
type:查询使用了何种类型 , 它在 SQL优化中是一个非常重要的指标,以下性能从好到坏依次是:
system> const > eq_ref > ref> ref_or_null > range > index > ALL
- system 是 const 的特例,也就是当表中只存在一条记录时 , type 为 system
- const,常量查询,id 是主键,通过 id 可以查询到所有信息
文章插图
- eq_ref , 连接查询中,primary key 或 unique key 索引的所有部分被连接使用

文章插图
user 的 id 和 dept 的 id 都是主键,在连接查询中,两个主键都被使用到
- ref,不使用唯一索引,使用普通索引或者唯一索引,可能会找到多个条件的值,idx_name 是普通索引

文章插图
- ref_of_null,和 ref 功能类似,区别在于会额外搜索索引包含 NULL 的值,name 字段是普通索引,且数据库中存在 name 为 null 的数据

文章插图
- range , 在索引字段上使用范围查询 , 常见的有 >、<、in、like 等查询

文章插图
- index , 通过索引树进行全表扫描

文章插图
- ALL,全表扫描,不通过索引树,因为这次是 select * 查询

文章插图
6、possible_keys
MySQL 分析此次查询可能会用到的索引,但是实际查询中不一定会用到

文章插图
分析可能会用到 idx_name 这个索引,实际查询中没有用到索引,走的全表扫描
7、key
查询时真正用到的 key

文章插图
查询中实际上用到了 idx_name 这个索引
8、ken_len
表示查询用到的索引列长度
推荐阅读
- Docker | Compose创建mysql容器
- 如何优雅的备份MySQL数据?看这篇文章就够了
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
- 一文讲清楚 JVM Safe Point
- day08-MySQL事务
- MySQL 窗口函数
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
- mac通过docker一键部署MySQL8
- day07-2MySQL索引
- CentOS部署MySQL