zoukankan      html  css  js  c++  java
  • MySQL Explain分析执行计算

    用法

    {EXPLAIN | DESCRIBE | DESC}
        tbl_name [col_name | wild]
    
    {EXPLAIN | DESCRIBE | DESC}
        [explain_type]
        {explainable_stmt | FOR CONNECTION connection_id}
    
    {EXPLAIN | DESCRIBE | DESC} ANALYZE select_statement    
    
    explain_type: {
        FORMAT = format_name
    }
    
    format_name: {
        TRADITIONAL
      | JSON
      | TREE
    }
    
    explainable_stmt: {
        SELECT statement
      | TABLE statement
      | DELETE statement
      | INSERT statement
      | REPLACE statement
      | UPDATE statement
    }
    
    

    explain 输出的字段含义

    Explain执行计划包含字段信息如下:id、select_type、table、partitions、type、possible_key、key、key_len、ref、rows、filtered和Extra 12个字段。

    字段 format=json时的名称 含义
    id select_id 该语句的唯一标识
    select_type 查询类型
    table Table_name 表名
    partitions partitions 匹配的分区
    type Access_type 连接类型
    possible_keys possible_keys 可能得索引选择
    key key 实际选择的索引
    key_len key_length 索引的长度
    ref ref 索引的哪一列被引用了
    rows rows 估计要扫描的行数
    filtered filtered 表示符合查询条件的数据百分比
    Extra 没有 附加信息

    type 连接类型,有如下几种取值,性能从好到坏排序如下

    • system:该表只有一行,相当于系统表,system是const类型的特例。
    • const:针对主键或唯一索引的等值查询扫描,最多只返回一行数据,const查询速度非常快,因为它仅仅读取一行数据即可。
    • eq_ref: 当使用了索引的全部组成部分,并且索引是primary key 或unique not null 才会使用该类型,性能仅次于system及const
    • ref: 当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。如果使用的索引实惠匹配到少量的行,性能也是不错的。
    • fulltext: 全文索引
    • ref_or_null:该类型类似于ref,但MySQL会额外搜索哪些行包括了NULL,这种类型常见于解析子查询 sql select * from ref_table where key_column = exp or key_column is null;
    • index_merge:表示使用了索引合并优化
    • unique_subquery:该类型和eq_ref类似
    • index_subquery:与unique_subquery类似
    • range:范围扫描,常见于between、><
    • index:全索引扫描,和ALL类似,只不过index是全哦按扫描了索引的数据。当查询仅使用索引中的一部分列时,可使用此场景。
    • ALL:全表扫描,性能最差。

    rows rows:以表的统计信息和索引使用情况,估算要找到所需要的记录,需要读取的行数。

    这是评估SQL性能的一个比较重要的数据,mysql需要扫描的行数,可以直观的显示SQL性能的好坏,一般情况下rows值越小越好。

    Extra Extra:不适合在其他列中显示的信息,explain中的很多额外的信息都会在extra字段显示。 using index:在相应的select操作中使用了覆盖索引。

    覆盖索引:通俗一点来说就是查询的列被索引覆盖,使用到覆盖索引查询速度非常快,SQL优化中理想的状态 using where:查询时未找到可用的索引,进而通过where条件过滤所需数据,但是要注意并不是所有带where语句的查询都会显示 using where using temporary: 表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。 using filesort:表示无法利用索引完成的排序操作,也就是order by 的字段没有索引,通常这样的SQL都是需要优化的。

    如果 order by 字段有索引就会用到覆盖索引,相比执行速度快很多。

    参考文章

  • 相关阅读:
    ContextLoaderListener和Spring MVC中的DispatcherServlet学习 随手记
    Linux目录详解
    9---PIP 管理工具的使用
    8. Python自定义模块humansize
    1. Hyper上的CentOS 6.5 网络配置
    Python基础学习8---list列表的操作
    Python基础学习6---存储器
    Python基础学习3---数据结构
    Python基础学习2---模块
    Python基础学习1---函数
  • 原文地址:https://www.cnblogs.com/shine-rainbow/p/mysql-explain-fen-xi-zhi-xing-ji-suan.html
Copyright © 2011-2022 走看看