sql优化之explain

1. explain的介绍

explain可以显示mysql是如何执行sql语句的,以便我们知道sql语句的性能瓶颈在哪,帮助我们进行相关的性能优化。

2. explain的使用方法

explain的使用方法比较简单,就是直接用explain+sql语句即可,如下所示:
image

3. explain各字段说明

  • 3.1 id
    select查询的序号,是一组数据,表示select语句的执行顺序,数字的值越大表示越先执行,如果数字值相等,则是按照从上到下的顺序进行执行。如:
    image
    先执行的就是:select role_id from role_menu where menu_id = 1,然后在执行select * from role where id =
    而id的值相同的,如下:
    image
    则这个的执行顺序则是从上往下,先执行的是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
image
- PRIMARY
image
- DERIVED
image
- UNION
image
- DEPENDENT UNION
image
- UNION RESULT
image
- SUBQUERY
image
- DEPENDENT SUBQUERY
image

  • 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表只有一条数据
image
- const
其中role表的id为主键,有两条数据
image
- eq_ref
其中role表id为主键,role_menu表role_id为唯一索引
image
- ref
其中role_menu表的role_id为普通索引
image
- range
其中admin表的name上有唯一索引
image
- index
其中role_menu表的role_id上有普通索引
image
- all
image

  • 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优化的时候起到很大的帮助。

posted @   _mcj  阅读(411)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示