美文网首页
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