美文网首页
Explain命令

Explain命令

作者: 游牧族人 | 来源:发表于2018-05-11 18:53 被阅读8次

    explain命令用来查询sql语句的执行计划。使得我们可以针对sql查询语句进行优化。
    例如:查看select * from test_user表的执行计划
    >>> explain select * from test_user

    id select_type table partitions type possible_keys key key_len ref rows filtered Extra
    1 SIMPLE test_user null ALL null null null null 1 100.00 null

    Id :
    id值代表查询语句的优先级,当只有一条查询语句时,他的id值为1,当有多个查询语句时,例如包含子查询的查询语句,那么查询语句的优先级顺序会在id列中显示,id越大语句查询优先级越高,对于同一个id值的不同行,从上到下语句查询的优先级依次降低。
    id的值可以为null,用来说明查询是其他行的联合结果,例如union。

    select_type :
    显示查询中每个select子句的查询类型。

    1. SIMPLE: 简单查询语句,不包含任何子查询或union查询等。
    2. PRIMARY:嵌套查询中代表最外层的select查询,union查询中代表最靠前的select查询。
    3. UNION:代表union查询中第二个及以后所有的select查询。
    4. DERIVED:代表嵌套查询中派生表对应的select查询语句(select...from (select ... from ...) )。
    5. UNION RESULT:代表union查询的结果。
    6. DEPENDENT UNION:依赖外部查询的,并且select_type满足UNION类型的select查询。
    7. SUBQUERY:代表子查询中的第一个select查询。
    8. DEPENDENT SUBQUERY:依赖外部查询的,并且select_type满足SUBQUERY类型的select查询。
      table:
      显示select查询的目标数据表及衍生出来的数据表。
      partitions:[暂时不知道怎么用]
      代表查询匹配的分区,对于没有分区的数据表,该值为null。
      type:
      type字段代表进行select查询时使用的扫描方法,通过该字段我们可以轻松的对查询语句进行优化。
      type的属性值:
      (1). ALL:全表扫描,查询性能最差,我们应该尽量避免type=ALL的查询。如果出现了ALL查询,我们可以通过为字段添加索引解决。
      (2). index:全索引扫描,和ALL类型类似,但是他只扫描索引,不扫描数据。
      (3). range:表示使用索引来查找指定范围的行,这种类型通常出现在=,<>,>=,<=,between,in等范围查询语句中。
      (4). index_subquery:
      (5). unique_subquery:
      (6). index_merger:
      (7). ref_or_null:
      (8). fulltext:
      (9). ref:通常出现于多表join查询中,用于匹配使用了非主键索引和非唯一索引的索引查找,或是使用了最左前缀规则索引的查询。
      (10). eq_ref:通常出现在多表join查询中,对于前一个表的每一个结果,在后表中只有一个结果与之匹配。通常用在 = 查询中。
      (11). const:针对主键和唯一索引的等值扫描查询,最多只返回一行数据。
      (12). system:表中只有一条数据,是特殊的const类型。
      possible_keys:
      该字段表示在select查询时能够使用到的索引。
      即使有些索引在possible_keys中出现,也不代表mysql一定会使用这些索引,具体使用哪些索引,在key字段体现。
      key:
      select查询真正使用到的索引。
      key_len:
      key_len显示mysql进行查询时使用的索引长度,这个值可以帮我们判断我们设置的索引是否在查询中被完全使用。
      key_len计算规则:
      char(n): n 字节长度
      varchar(n): 如果是 utf8 编码, 则是 3 n + 2字节; 如果是 utf8mb4 编码, 则是 4 n + 2 字节.
      TINYINT: 1字节
      SMALLINT: 2字节
      MEDIUMINT: 3字节
      INT: 4字节
      BIGINT: 8字节
      DATE: 3字节
      TIMESTAMP: 4字节
      DATETIME: 8字节
      ref:
      select查询的过滤方法。
      rows:
      mysql认为他在执行select查询时必须检查的行数(预估值)。越少效率越高。
      filtered:
      这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例。
      其他详细信息。
    信息 含义
    Using filesort mysql 没有使用索引进行查询结果排序,此时需要优化
    Using temporary 查询使用了临时表,查询效率不高,需要优化
    Using index 表示查询在索引中就能找到数据,不需要扫描数据表,效率较高
    Using index condition mysql可以在索引中执行like操作,减少了不必要的IO操作
    Using where 使用where语句来限制哪些行将与下一张表匹配或者是返回给用户

    相关文章

      网友评论

          本文标题:Explain命令

          本文链接:https://www.haomeiwen.com/subject/bvkqdftx.html