• MySQL Explain 关键字详解


    概述

    explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能

    使用方式如下:explain + sql

    sql
    explain select * from t1
    

    执行计划各字段含义

    1. id

    • 如果 id 序号相同,从上往下执行
    • 如果 id 序号不同,序号大先执行
    • 如果两种都存在,先执行序号大,在同级从上往下执行
    • 如果显示 NULL,最后执行,表示结果集,并且不需要使用它来进行查询

    2. select_type

    表示查询的类型,取值有如下:

    SIMPLE:简单的 select 查询,不包含子查询或者 UNION

    PRIMARY:复杂查询中最外层查询,比如使用 union 或 union all 时,id 为 1 的记录 select_type 通常是 primary

    SUBQUERY:指在 select 语句中出现的子查询语句,结果不依赖于外部查询(不在 from 语句中)

    DEPENDENT SUBQUERY:指在 select 语句中出现的查询语句,结果依赖于外部查询

    DERIVED:derived 称为派生表,在 FROM 子句的查询语句,表示从外部数据源中推导出来的,而不是从 SELECT 语句中的其他列中选择出来的

    UNION:若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION;若 UNION 包含在 FROM 子句的子查询中,那么第一个 SELECT 将被标记为 DERIVED

    UNION RESULT:UNION 的结果

    DEPENDENT UNION:当 union 作为子查询时,其中第一个 union 为 dependent subquery,第二个 union 为 dependent union

    3. table

    表示当前行正在访问的表

    4. type

    表示查询使用的类型,性能由好到坏依次是:system > const > eq_ref > ref > range > index > all,一般来说能达到 range 级别,最好能达到 ref 级别

    system:表只有一行(相当于系统表),是 const 类型的特例

    const:针对主键或唯一索引的等值查询扫描,只返回一行数据

    eq_ref:基于主键或唯一索引连接两个表,对于每个索引键值,只有一条匹配记录,被驱动表的类型为 eq_ref,这种类型只出现在 join

    ref:非唯一性索引扫描,返回匹配多个符合条件的行

    range:范围扫描,检索指定范围的行,一般出现在 where 语句出现 between、< 、>、in 等的查询

    index:只遍历索引树即可找到匹配的数据,比如下例中 user_id 就是 orders 表的索引

    all:遍历全表找到匹配的数据

    5. possible_keys

    显示可能使用到的索引,实际不一定被使用

    6. key

    实际使用的索引

    7. key_len

    索引使用的字节数,可通过该列计算查询中使用的索引的长度,主要用于联合索引

    比如现有 users 表,执行以下 sql,该表有为 name 和 email 字段设置联合索引 index_name_email

    sql
    explain select * from users where name = "张三" and email = "xxx@qq.com"
    

    执行结果如下:

    users 表结构如下:

    name 和 email 字段都为 varchar,一个字符占 3 个字节,所以 key_len = 50 * 3 + 2 + 1 + 100 * 3 + 2 = 455,其中 varchar 需要额外占用 2 个字节,允许 NULL 值额外占用 1 个字节

    据此我们可以得知 index_name_email 中的 name 和 email 字段都被使用了

    8. ref

    表示哪些列或常量被用于匹配用到的索引

    9. rows

    根据表统计信息及索引选用情况,估算出找到所需的记录所需要读取的行数,值越小越好,它不是结果集中的行数

    10. filtered

    表示某个表经过条件过滤之后,剩余记录条数的百分比

    11. Extra

    包含一些重要的额外信息

    Using index:出现索引覆盖,即查询和检索条件的列都在使用的索引里面,不需要回表

    Using where:不通过索引查询需要的数据

    下例中 total_price 字段不存在索引

    Using index condition:表示查询列不被索引覆盖,where 条件中是一个索引范围查找,过滤完索引后回表找到所有符合条件的数据行

    Using filesort:当查询包含排序操作,又无法利用索引完成排序操作时,数据较少在内存排序,数据较多则在磁盘排序

    Using temporary:在做如去重、排序和分组等功能时,如果不能有效利用索引,就需要建立临时表来完成


    __EOF__

  • 本文作者: 低吟不作语
  • 本文链接: https://www.cnblogs.com/yee-q/p/18066673
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    数据库系列:业内主流MySQL数据中间件梳理
    uvm_config_db传递的参数类型统计
    安装模块失败?一篇文章教你如何解决掌握镜像安装~
    PG::Covfefe
    使用C++生成dll(动态链接库),并用python调用
    J2EE项目部署与发布(Windows版本)->会议OA单体项目Windows部署,spa前后端分离项目Windows部署
    Qml-跨窗口拖动图片、物体
    阶段性检测实战项目----文件搜索引擎
    电脑磁盘大文件扫描工具WizTree下载、使用教程
    Yum安装JDK11
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/18066673