mysql学习记录 - explain命令

author:zxw

email:502513206@qq.com

@ Jishou University


1.前言

最近买了mysql的一个课程,基本已经看完第一轮了,第一轮只是留个印象在脑海中还不算深入的理解,想想最近很久没写过博客了,刚好来记录下学习的理解以及加深印象。

2.Content

有关explain官方是这样解释的,explain提供mysql如何执行语句的信息,可以和select,delete,insert,replace,update命令一起使用。

The EXPLAIN statement provides information about how MySQL executes statements:

explain select * from news我们在数据库中执行该条sql语句得到执行信息如下,顺带一提mysql每行输出都提供一个表的信息,如果你连表查询则下面就会多几行

在这里插入图片描述
在这里插入图片描述

看着参数很多好像完全记不住的样子,不要怕,下面列一个表格对每一个列进行完整的解释,彻底拿下这行表格含义。

  1. id

    我们上面执行select语句的顺序号,当然如果对多个表进行分析它如果是一条sql里面的,生成的id其实都是一样的。这其实不重要,我们只要知道只是个序列号就行了,当然如果该select是引用的其他结果集的并集时,这是id为会null

  2. select_type

    就是我们select语句的类型,select_type的类型一共有11种,不一一列出,就挑几个常见的来看

    • SIMPLE:简单查询,意思就是没有使用union的sql

    • PRIMARY:最外层的sql

    • UNION:UNION中的第二个或者更下层的sql

    我们执行如下sql

    EXPLAIN 
    (select acct.id,ot.id from account_tbl as acct,order_tbl as ot where acct.user_id = ot.user_id and acct.user_id = 'U100000' limit 0,1 )
    union all
    (select acct.id,ot.id from account_tbl as acct,order_tbl as ot where acct.user_id = ot.user_id and acct.user_id = 'U100000' limit 0,1)
    

    得到的结果集如下,可以看到select_type为primary和union,可以看到第一个select被标注为PRIMARY意思是最外层的sql,而union下面的sql则被标注为union
    在这里插入图片描述

  3. table:就是select执行的表名,没什么好说的

  4. partitions:非分区表该字段为null,可以使用show table status from fescar命令查看Create_options字段

  5. type:链接类型,这个是我们关注的重点字段

    • system:系统表,const类型链接的特例。

    • const:常量级查询,速度非常快。对主键或者唯一索引进行匹配时当做常量处理

      explain select * from storage_tbl where commodity_code = 'C100000' and id= 21

      得到如下结果
      在这里插入图片描述

    • eq_ref:除了先前两种类型最好的一种,当我们使用表链接操作时,如果连接使用的是主键索引或者非空的唯一索引时,就会产生该类型

      explain select * from storage_tbl,test where storage_tbl.commodity_code = test.name

      结果集如下
      在这里插入图片描述

    • ref:如果索引不是主键或者非空唯一索引类型,则会产生此type

    • fulltext:全文索引

    • ref_or_null:如果使用了isNull

    • index_merge:索引合并优化

    • unique_subquery:使用in语句

    • range:当我们对索引使用范围查询时

    • index:仅扫描索引树

      sql:explain select storage_tbl.id from storage_tbl,test where storage_tbl.commodity_code = 'C100000'这边进行了一个连表查询,并且仅对表一进行匹配,最后的结果如下

      我们对表2是没有进行匹配操作的,所以表二是走了整个索引树的查询,type为index,所以index类型实际上就是索引全扫描。如果你不想索引全扫描则可以加where判断条件

在这里插入图片描述

  • all:全表扫描
  1. possible_keys

    列出sql语句中使用到的索引

    sql:explain select storage_tbl.id,storage_tbl.commodity_code from storage_tbl where storage_tbl.id = 21 and storage_tbl.commodity_code = 'C100000'这里我有两个索引,id、commodity_code

    从结果集看到列出了使用了的索引名称

在这里插入图片描述

  1. key:展示mysql决定使用的索引名称,上图可以看到该值为PRIMARY

  2. key_len:选择的密钥的长度,如果key为null,则该值为null

  3. ref:显示将哪些列或常量与键列中命名的索引进行比较以从表中选择行。

  4. rows:匹配的行数

  5. filtered:通过where之类过滤后剩余的数据

  6. Extra:其他信息,比如上面的Using index之类的

对于explain的总结就这么多了,下次记录下真实场景下的explain调优实例,毕竟总归要实践才能体现价值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值