1. explain的介绍
explain可以显示mysql是如何执行sql语句的,以便我们知道sql语句的性能瓶颈在哪,帮助我们进行相关的性能优化。
2. explain的使用方法
explain的使用方法比较简单,就是直接用explain+sql语句即可,如下所示:
3. explain各字段说明
- 3.1 id
select查询的序号,是一组数据,表示select语句的执行顺序,数字的值越大表示越先执行,如果数字值相等,则是按照从上到下的顺序进行执行。如:
先执行的就是:select role_id from role_menu where menu_id = 1
,然后在执行select * from role where id =
而id的值相同的,如下:
则这个的执行顺序则是从上往下,先执行的是select * from role where id in
,然后在执行select role_id from role_menu where menu_id = 1
- 3.2 select_type
主要用来表示查询的类型,其值有SIMPLE、PRIMARY、DERIVED、UNION、DEPENDENT UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY等,各个值的含义为:
值 | 含义 |
---|---|
SIMPLE | 简单查询,也就是不使用子查询、嵌套查询、关联查询的查询 |
PRIMARY | 通常是复杂查询的最外层 |
DERIVED | 一个表中查询另一个满足条件的集合,一般用于将子查询放到临时表中,会展示这个类型 |
UNION | 多个查询的并集查询,一般是在union后的查询语句显示这个类型 |
DEPENDENT UNION | 依赖联合查询,一般是在依赖的子查询中使用union进行并集查询 |
UNION RESULT | 联合结果查询,通常是联合查询的最终结果,带有联合查询的情况下,都有这种查询,表示把两个或者多个查询结果合并起来 |
SUBQUERY | 子查询,通常是子查询中的记录数确认为不超过2条的情况下,为子查询,如果子查询为一个集合,则演变为依赖子查询。 |
DEPENDENT SUBQUERY | 依赖子查询,通常是子查询中的记录数超过了两条 |
各个类型的sql样例为:
- SIMPLE
- PRIMARY
- DERIVED
- UNION
- DEPENDENT UNION
- UNION RESULT
- SUBQUERY
- DEPENDENT SUBQUERY
- 3.3 table
这个指的当前执行的sql语句查询的表 - 3.4 partitions
代表分区表中的命中情况,非分区表,该项为NULL,一般情况下我们的查询语句的执行计划的partitions的列的值都是NULL - 3.5 type
主要是用来显示查询使用了那种类型,其类型主要有以下几种,且其性能从大到小为:system > const > eq_ref > ref > range > index > all
。
一般查询的时候要求性能要达到range级别,最好能到ref级别。
各个类型的含义如下:
类型 | 含义 |
---|---|
system | 表只有一行记录,是const类型的特列 |
const | 表示通过索引一次就找到了 |
eq_ref | 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配 |
ref | 非唯一性索引扫描,返回匹配某个单独值的所有行,与唯一性索引的区别就是唯一性索引查询的数据只有一条,而非唯一性索引查询的数据会有多条 |
range | 只检索给定范围的行,使用一个索引来选择行 |
index | 遍历全部索引树 |
all | 遍历全表 |
各个类型的样例为:
- system
其中t表只有一条数据
- const
其中role表的id为主键,有两条数据
- eq_ref
其中role表id为主键,role_menu表role_id为唯一索引
- ref
其中role_menu表的role_id为普通索引
- range
其中admin表的name上有唯一索引
- index
其中role_menu表的role_id上有普通索引
- all
- 3.6 posible_keys
可能会用到的表中的索引,一个或多个,不一定实际用到 - 3.7 key
实际用到的表中索引 - 3.8 key_len
表示索引中使用的字节数 - 3.9 ref
显示索引的哪一列被使用了,如果是个常数的话显示为const - 3.10 rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好 - 3.11 filtered
表示通过查询条件获取的最终记录行数占通过type字段指明的搜索方式搜索出来的记录行数的百分比。这个字段的值越大越好,这个值越大说其所使用的索引的效果越好。 - 3.12 Extra
显示扩展的一些其他信息:
值 | 含义 |
---|---|
Using filesort | mysql会对数据使用一个外部的索引排序 |
Using temporary | 使用了用临时表保存中间结果 |
Using index | 表示在查询时使用了覆盖索引 |
Using where | 表示使用了where过滤 |
Using join buffer | 表示在查询时使用了连接缓存 |
impossible where | 表示where子句的值总是false |
distinct | 再找到第一个值之后停止找同样值 |
4. 总结
这里主要介绍了mysql的explain执行计划,学会使用explain之后能够对我们进行sql优化的时候起到很大的帮助。
标签:UNION,explain,查询,索引,role,sql,优化,id From: https://www.cnblogs.com/mcj123/p/17001669.html