mysql之explain分析

在这里对explain的各个字段进行详细的分析,来帮助大家分析自己所写的sql是否最佳的使用了索引。

首先是select_type:将select查询分为简单(simple)和复杂两种类型
复杂类型又分为子查询(subquery)和from列表中包含子查询(drived)
simple:

  1. SELECT * FROM tp_lifecircle_consume WHERE order_sn = '20200413142059634292';
    在这里插入图片描述

  2. 复杂类型:SELECT * FROM tp_users WHERE id in (select uid from tp_wxuser)
    在这里插入图片描述

    就type进行详细的介绍:

System,const,eq_ref,ref,range,index,all

  1. const : 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
    SELECT * FROM tp_lifecircle_consume WHERE order_sn = '20200413142059634292';
  2. ref 指的是使用普通的索引(normal index)。
    SELECT * FROM tp_lifecircle_consume WHERE token = '208543';
  3. range 对索引进行范围检索。 SELECT * FROM tp_lifecircle_consume WHERE create_time BETWEEN UNIX_TIMESTAMP('2020-04-19 00:00:00') and UNIX_TIMESTAMP('2020-04-20 23:00:00');
  4. index (索引物理文件全扫描,速度非常慢,跟全表扫描是小巫见大巫)
    SELECT * FROM tp_lifecircle_consume ORDER BY id desc LIMIT 100000, 10;
  5. all (全表扫描)
    SELECT * FROM tp_lifecircle_consume ;

(1)all : 即全表扫描
index : 按索引次序扫描,先读索引,再读实际的行,结果还是全表扫描,主要优点是避免了排序。因为索引是排好的。

(2)range:以范围的形式扫描。
explain select * from a where a_id > 1\G

(3)ref:非唯一索引访问(只有普通索引)

create table a(a_id int not null, key(a_id));
insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
mysql> explain select * from a where a_id=1\G

(4)eq_ref:使用唯一索引查找(主键或唯一索引)
(5)const:常量查询
在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。

​当结果不是一条时,就会变成index或range等其他类型
(6)system:系统查询

  • null:优化过程中就已经得到结果,不在访问表或索引

  • possible_keys:可能用到的索引

  • key:实际用到的索引

  • key_line:索引字段最大可能使用长度

  • ref:
    指出对 key 列所选择的索引的查找方式,常见的值有 const, func, NULL, 具体字段名。当 key 列为 NULL ,即不使用索引时,此值也相应的为 NULL 。

  • rows:估计需要扫描的行数

  • Extra:显示以上信息之外的其他信息

  • Using index

    此查询使用了覆盖索引(Covering Index),即通过索引就能返回结果,无需访问表。
    若没显示"Using index"表示读取了表数据。

  • Using index condition

    使用了索引下推(ICP)的功能([看ICP详解]

    ICP只能针对二级索引进行使用。不需要针对主键索引

  • Using where

    表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。因为检查是在读取行后才进行的,所以称为“后过滤”。

  • Using temporary

使用到临时表
建表及插入数据:

create table a(a_id int, b_id int);
insert into a values(1,1),(1,1),(2,1),(2,2),(3,1);
mysql> explain select distinct a_id from a\G
        Extra: Using temporary

MySQL 使用临时表来实现 distinct 操作。

  • Using filesort

若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现

  • Using filesort 。

select * from a order by id;
对于没有索引的列进行order by 就会出现filesort

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值