当前位置:网站首页>MySQL-Explain详解
MySQL-Explain详解
2022-07-30 05:31:00 【web13618542420】
Explain介绍
在select语句之前增加explain关键字,执行后MySQL就会返回执行计划的信息,而不是执行sql。但如果from中包含子查询,MySQL仍会执行该子查询,并把子查询的结果放入临时表中。
Explain中的列
① id列
id列的编号是select的序列号,有几个select就有几个id,并且id是按照select出现的顺序增长的,id列的值越大优先级越高,id相同则是按照执行计划列从上往下执行,id为空则是最后执行。
② select_type列
表示对应行是简单查询还是复杂查询。
1)simple:不包含子查询和union的简单查询

2)primary:复杂查询中最外层的select
3)subquery:包含在select中的子查询(不在from的子句中)
用如下图展示primary和subquery类型

4)derived:包含在from子句中的子查询。mysql会将查询结果放入一个临时表中,此临时表也叫衍生表。

5)union:在union中的第二个和随后的select,UNION RESULT为合并的结果
③ table列
表示当前行访问的是哪张表。当from中有子查询时,table列的格式为,表示当前查询依赖id=N行的查询,所以先执行id=N行的查询,如上面select_type列图4所示。当有union查询时,UNION RESULT的table列的值为<union1,2>,1和2表示参与union的行id。
④ partitions列
查询将匹配记录的分区。 对于非分区表,该值为 NULL。
⑤type列
此列表示关联类型或访问类型。也就是MySQL决定如何查找表中的行。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all。
NULL:MySQL能在优化阶段分解查询语句,在执行阶段不用再去访问表或者索引。
system、const:MySQL对查询的某部分进行优化并把其转化成一个常量(可以通过show warnings命令查看结果)。system是const的一个特例,表示表里只有一条元组匹配时为system。

eq_ref:主键或唯一键索引被连接使用,最多只会返回一条符合条件的记录。简单的select查询不会出现这种type。
ref:相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一索引的部分前缀,索引和某个值比较,会找到多个符合条件的行。
range:通常出现在范围查询中,比如in、between、大于、小于等。使用索引来检索给定范围的行。
index:扫描全索引拿到结果,一般是扫描某个二级索引,二级索引一般比较少,所以通常比ALL快一点。

ALL:全表扫描,扫描聚簇索引的所有叶子节点。
⑥possible_keys列
此列显示在查询中可能用到的索引。如果该列为NULL,则表示没有相关索引,可以通过检查where子句看是否可以添加一个适当的索引来提高性能。
⑦ key列
此列显示MySQL在查询时实际用到的索引。在执行计划中可能出现possible_keys列有值,而key列为null,这种情况可能是表中数据不多,MySQL认为索引对当前查询帮助不大而选择了全表查询。如果想强制MySQL使用或忽视possible_keys列中的索引,在查询时可使用force index、ignore index。
⑧ key_len列
此列显示MySQL在索引里使用的字节数,通过此列可以算出具体使用了索引中的那些列。索引最大长度为768字节,当长度过大时,MySQL会做一个类似最左前缀处理,将前半部分字符提取出做索引。当字段可以为null时,还需要1个字节去记录。
key_len计算规则:
字符串:
char(n):n个数字或者字母占n个字节,汉字占3n个字节
varchar(n):n个数字或者字母占n个字节,汉字占3n+2个字节。+2字节用来存储字符串长度。
数字类型:
tinyint:1字节 smallint:2字节 int:4字节 bigint:8字节
时间类型
date:3字节 timestamp:4字节 datetime:8字节
⑨ ref列
此列显示key列记录的索引中,表查找值时使用到的列或常量。常见的有const、字段名
⑩ rows列
此列是MySQL在查询中估计要读取的行数。注意这里不是结果集的行数。
Extra列
此列是一些额外信息。常见的重要值如下:
1)Using index:使用覆盖索引(如果select后面查询的字段都可以从这个索引的树中获取,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值,这种情况一般可以说是用到了覆盖索引)。
2)Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖。
3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个查询的范围。
4)Using temporary:MySQL需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的。
5)Using filesort:将使用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。
6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时。
边栏推荐
猜你喜欢

curl (7) Failed connect to localhost8080; Connection refused

Golang go-redis cluster模式下不断创建新连接,效率下降问题解决

五一去见了一些身价数千万的成功人士,我一些新的思路和启示

MySql string splitting realizes the split function (field splitting, column switching, row switching)

翻译 | Kubernetes 将改变数据库的管理方式

SQL连接表(内连接、左连接、右连接、交叉连接、全外连接)

MySQL(3)

MySQL - 函数及约束命令

Internet (software) company project management software research report

An old programmer's summary review of 2020, how to become more awesome in 2021
随机推荐
cookie和session区别
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
mysql基础(4)
curl (7) Failed connect to localhost8080; Connection refused
[GStreamer] 插件的名字要和GST_PLUGIN_DEFINE匹配
黄金圈法则:成功者必备的深度思考方法
机器学习—梯度下降Gradient Descent Optimization—c语言实现
【Koltin Flow(二)】Flow操作符之末端操作符
并发编程复习
【LeetCode】Day107-除自身以外数组的乘积
asyncawait和promise的区别
即刻报名|如何降低云上数据分析成本?
idea 编译protobuf 文件的设置使用
mysql高阶语句(一)
分布式事务之 Seata框架的原理和实战使用(三)
【小程序项目开发 -- 京东商城】uni-app 商品分类页面(下)
参与开源,让程序员找回热血和激情
1475. 商品折扣后的最终价格
MySQL(4)
I went to meet some successful people worth tens of millions on May 1st, and I have some new ideas and inspirations