mysql 的explain参数

文章详细解析了MySQL查询执行计划中的关键指标,如id表示的执行顺序,select_type涉及的查询类型,以及type表示的访问类型,包括system、const、eq_ref、ref等。此外,还介绍了key_len表示的索引长度,row预估的读取行数,以及extra字段提供的额外信息,如Usingfilesort和Usingindex。这些概念对于优化SQL查询性能至关重要。

在这里插入图片描述

最重要的指标 id type key ref extra

id 表示表的读取顺序
id 查看SQL语句的执行顺序
            id相同:从上到下执行;
            
            id不同:按从大到小顺序执行;
            
            id部分相同、部分不同: 相同部分从上到下执行
                                不同部分从大到小顺序执行
                                
            id相同可以看做一个分组
select_type 数据查询类型
查询类型:包括[普通查询,联合查询,子查询,主查询]

simple   简单查询 查询不包含子查询或者union

primary  主查询 查询中包含任何复杂的子部分,最外层被标记为primary

subquery 子查询 在selectwhere列表中包含了子查询
              例: select * from t1 where id = (select id from t2)
              from t1 会被标记为 主查询 并且id被标记为1
              from t2 会被标记为 子查询 并且id被标记为2
              所以查询顺序为先查询子查询 然后查询主查询
              
derived 在from列表中包含的子查询会被标记为derived(衍生)MySQL会递归执行这些子查询,并把结果放入临时表中

union 若第二个select出现在union之后,则会被标记为unionunion包含在from子句的子查询中,外层select会被标记为derived


union result 从union表获取结果的select

table 是哪张表的数据
type 访问类型
从最好到最差 system->const->eq_ref->ref->index->all
百万级别可以优化 一般到range级别

system 表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计
            
const 表示通过一次索引就找到了,const用于比较primary key 或者unique 索引

eq_ref 唯一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配,常用于主键或唯一索引扫描
	   比如给身份证建立唯一索引,查询身份证号为XXX的学生,那么表中肯定只有一个学生数据与之匹配

ref 非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,
    它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以它应该属于查找个扫描的混合体
    * 比如给age建立索引然后查询age=18的学生,它有可能找到多个学生
    * range 给定索引的范围,通过范围查询
    * 比如通过主键索引 查询主键id为10~20的学生 select * from student where id 》=10 and id《=20

index 全索引扫描
      比如 select id from student 查询student中的所有id 由于id是主键索引 索引为全索引扫描

all 全表扫描

possible_keys 显示可能被这张表查询使用到的索引
可能有一个或多个 查询设计到的字段上若存在索引,则改索引将被列出,但不一定被查询实际使用
例如:student表中有id,name,age 我在查询student数据时,可能会用到这几个索引中的一个或多个,
那么可能被用到的索引,就会被列出来

key 查询中实际被用到的索引
如果为null,则表示没有使用索引,查询中若使用了覆盖索引,则该索引仅出现在key列表中
possible_keys 与 key比较
	possible_keys 理论上			key 实际上
    情况1:理论上会使用3个索引      实际上值用了1个或两个
    情况2:理论上能用3个索引        实际上一个也没用到
    情况2:理论上不会用到索引       实际上来用到了一个或多个
key_len
key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精度的情况下,长度越短越好
显示的值为使用字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
ref
ref 显示索引的哪一列被使用了,有可能是被使用的列,也有可能是一个常数const
            * 如果使用到了列索引 则显示 库名.表名.列名
            * 如果使用到了常数   则显示const
            * 例:其中t1表的col1和col2是联合索引
            * select * from t1,t2 where t1.col1 = t2.col1 and t1.col2 = 'dc'
            * 该查询 使用到了t1的索引列 col1 和 常数 'dc'
            * ref显示 库名.表名.列名(col1) 和 const

row
根据表统计信息及索引选用情况,大致估算出 找到需要的数据 要读取多少行数 该参数越短越好
extra 额外信息
distinct:在select部分使用了distinc关键字

Using filesort:当 Extra 中有 Using filesort 时表示MySQL需额外的排序操作不能通过索引顺序达到排序效果一般有 Using filesort, 都建议优化去掉因为这样的查询 CPU 资源消耗大

Using index“覆盖索引扫描”表示查询在索引树中就可查找所需数据不用扫描表数据文件往往说明性能不错

Using temporary查询有使用临时表一般出现于排序,分组和多表join的情况查询效率不高建议优化

using where: where 子句用于限制哪一行

using join buffer: 使用连接缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值