EXPLAIN 执行语句分析


前置:建表语句

CREATE TABLE `test_user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` varchar(36) NOT NULL COMMENT '用户id',
  `user_name` varchar(30) NOT NULL COMMENT '用户名称',
  `phone` varchar(20) NOT NULL COMMENT '手机号码',
  `lan_id` int NOT NULL COMMENT '本地网',
  `region_id` int NOT NULL COMMENT '区域',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `un_idx_phone` (`phone`) USING BTREE,
  KEY `idx_user_id` (`user_id`),
  KEY `idx_uid_phone` (`user_id`,`phone`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1010001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

1.explain 用法

explain + sql语句

2.描述符含义

描述符含义
id执行顺序。(id 越大越先执行、id 相同由上至下)
select_type查询的类型
table显示这一行的数据是关于哪张表的
partitions使用的哪个分区,需要结合表分区才可以看到
typetype显示的是访问类型,是较为重要的一个指标
possible_keys查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
key实际使用的索引。如果为NULL,则没有使用索引
key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度;key_len应尽量短,越短效率越高
ref哪些列或常量被用于查找索引列上的值
rows显示MySQL认为它执行查询时必须检查的行数,越小越好
filtered表示返回结果的行数占需读取行数的百分比,越大越好
Extra一些额外信息

2.1 id 介绍

2.1.1 id 相同

在这里插入图片描述

id 相同,是同一组,执行顺序由上至下

2.1.2 id 不同

在这里插入图片描述

id 不同,不是同一组,执行顺序按 id 由大到小

注意:这条语句 tu.id = 不能改成 tu.id in,我使用 mysql 是8.* 版本,in (sql语句) 会被优化城 join 语句,所有看到的是这样的
在这里插入图片描述

2.2 select_type 介绍

select_type 类型解释示例
SIMPLE简单SELECT,不使用UNION或子查询等在这里插入图片描述
PRIMARY子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY在这里插入图片描述
UNIONUNION中的第二个或后面的SELECT语句在这里插入图片描述
DEPENDENT UNIONUNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULTUNION的结果,union语句中第二个select开始后面所有select
SUBQUERY子查询中的第一个SELECT,结果不依赖于外部查询
DEPENDENT SUBQUERY子查询中的第一个SELECT,依赖于外部查询
DERIVED派生表的SELECT, FROM子句的子查询
UNCACHEABLE SUBQUERY一个子查询的结果不能被缓存,必须重新评估外链接的第一行

2.3 table 介绍

显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称

2.4 partitions 介绍

暂无

2.5 type 介绍

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。

类型说明性能从低到高示例
ALLFull Table Scan, MySQL将遍历全表以找到匹配的行1在这里插入图片描述
indexFull Index Scan,index与ALL区别为index类型只遍历索引树2在这里插入图片描述
range只检索给定范围的行,使用一个索引来完成3在这里插入图片描述
ref使用非唯一性索引检索,返回匹配某个单独值的所有行4在这里插入图片描述
eq_ref唯一性索引检索,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描5
const表示通过索引一次就找到了,const用于比较primary key或者unique索引,如将主键置于where列表中,MySQL就能将该查询转换为一个常量6在这里插入图片描述
system表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计7
NULL8

2.6 possible_keys 介绍

查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

2.7 key 介绍

实际使用的索引。如果为NULL,则没有使用索引

2.8 key_len 介绍

表示索引中索引键使用的字节数,可通过该列计算查询中使用的索引的长度

key_len应尽量短,越短效率越高

2.9 ref 介绍

哪些列或常量被用于查找索引列上的值。如果是列,则显示字段名;如果是常数,则显示const

在这里插入图片描述

常量被用于查找索引树上的值,那么 ref = const

在这里插入图片描述

列被用于查找索引树上的值,那么 ref = 列

2.10 rows 介绍

显示MySQL认为它执行查询时必须检查的行数,越小越好

注意,针对limit语句,这个是不准确的

在这里插入图片描述

这里真实 rows = 100

2.11 filtered 介绍

表示返回结果的行数占需读取行数的百分比,越大也就意味着有效查询越高

2.12 Extra 介绍

一些额外信息

类型说明示例
Using filesort无法利用索引完成的排序操作称为“文件排序在这里插入图片描述
Using temporary使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于分组查询group by在这里插入图片描述
Using index索引覆盖在这里插入图片描述
Using where触发条件 = 需要回表 + where过滤在这里插入图片描述
Using where & Using index触发条件=不能回表 + 使用了二级索引 + where过滤在这里插入图片描述>、<、like 等条件是 where 过滤的
Using index condition索引下推 ,触发条件 = 需要回表 + 使用了二级索引 + where条件可以放在innodb层过滤在这里插入图片描述
Using join buffer使用了连接缓存

疑惑?

explain select id from test_user where user_id < '4d91881a-b157-11ec-9699-7c10c99db896';

该执行计划 Extra 字段为啥是 Using where & Using index?个人理解是 service 层还要进行一遍 user_id > 过滤,可能各种引擎(mysiam)没有很好的实现(a > 0、a >= 0)这种检索,会把 0 也带出来,所以需要 service 层进一步过滤

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值