当前位置: 代码迷 >> 综合 >> mysql中的 explain 关键字学习笔记
  详细解决方案

mysql中的 explain 关键字学习笔记

热度:15   发布时间:2023-12-13 10:45:40.0

explain 查看sql的执行计划,使用该关键字可以查看分析sql 语句在 mysql 中的执行步骤,索引的使用,可以检查该sql 语句和表结构的性能瓶颈,在sql 优化中工作可以说该关键字是相关开发工作人员必会的。

用法: explain 查询语句;
??在这里插入图片描述

explain 返回结果说明

  • 1. id
  • 2. select_type
  • 3. table
  • 4. partitions
  • 5. type
  • 6. possible_keys
  • 7. key
  • 8. key_len
  • 9. ref
  • 10. row
  • 11. filtered
  • 12. Extra

1. id

?
通过该id字段,可以查看出sql语句的执行顺序

id 相同, 查询执行表顺序由上至下

在这里插入图片描述

id 不同,如果是子查询 id的序号会递增,id值越大优先级越高,则优先会执行

在这里插入图片描述

    id 有的相同有的不同,则id序号大的会优先执行,id相同的由上到下执行

在这里插入图片描述?

2. select_type

查询sql的类型

类型 说明
SIMPLE 简单的select查询,查询中不包含子查询或UNION
PRIMARY 查询中若包含如何复杂的子查询,最外层标记为 PARIMARY,一般最后加载的表
SUBQUERY 在select 或 where 列表中包含子查询语句
DERIVED 在from 列表中包含的子查询标记为DERIVED (衍生) mysql 会递归执行这些查询,把结果集放在临时表中
UNION 出现在 UNION 之后的查询语句会被标记为 UNION, 若UNION包含在FROM 子句的子查询中,外层SELECT将被标记为DERIVED
UNION RESULT UNION 查询的结果集

3. table

    查询的表名称,显示所查询的表名称,如果要是别名则显示别名,衍生表显示<derived>

4. partitions

如果查询是基于分区表的话,会显示查询将访问的分区。

5. type

查询数据的类型,性能由好到差排列

  system > const > eq_ref > ref > fultext > ref_or_null > index _merge > unique_subquery >  index_subquery > range > index >ALL
system 表只能一行记录(等于系统表),const类型的特列,平时基本不会出现。
const 表示通过索引一次就能找到,const用于比较parmary_key 或者 unique 索引,因为只匹配一行数据,所以主键至于where列表中,mysql就能将该查询转换为一个常量
eq_ref 唯一性索引扫描,对每个索引建,表中只有一条记录与之匹配,常建于主键或唯一索引扫描
ref 非唯一性索引扫描,返回匹配某个单独值的所有行本质上也是一种索引访问,他返回所有匹配某个单独值的行,然而,他可能会出现找到多个符合条件的行,所以他应该属于查找和扫描的混合体
range 只检索指定范围的行,使用一个索引来选择行,key 列显示使用了那个索引一般就是在where语句出现了between、<、>、in等的查询。这种范围扫描索引比扫描全表要好,因为扫描的只是某个范围区间。
index full index sacn,index 与all的区别是,index类型只遍历索引树,通常比all快。因为索引文件通常比数据文件小.
all full table sacn,将遍历全表以找到匹配的行

6. possible_keys

    列出查询sql可能会用到的索引,该值可能会一个或多个,但不一定在实际查询中被用到

7. key

    列出查询sql中实际被使用到的索引,显示null 则没有使用索引

8. key_len

    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key-len是根据表定义计算而得,不是通过表内检索出的

9. ref

    显示索引的那一列被使用,如果可能的话,是一个常数。哪些列或常量被用于查找索引列的值

10. row

    根据表统计信息及索引引用情况,大致估算出找到所需的记录所需读取的行数。

11. filtered

查询条件过滤的行数的百分比

12. Extra

包含不适合在其它列中显示但十分重要的额外信息
Using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql 中无法利用索引完成的排序操作称为 ‘文件内排序’
Using temporary 使用临时表保存中间结果,mysql 在对查询结果排序的时候使用了临时表,常见于排序 order by
Using index 表示相应的select 操作中使用了复合索引,避免访问了表的数据行,效率不错。如果同时出现了 using where,表明索引被用来执行索引键值查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
Using where 使用了where 过滤
Using join buffer 使用了连接缓存
impossible where where子句的值总是false,不能获取任何数据
select tables optimized away 在没有group by 子句的情况下,基于索引优化MIN/MAX操作或者myisam存储引擎优化count(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即完成优化
  相关解决方案