欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MYSQL之explain详解

程序员文章站 2024-03-23 15:42:16
...

一、基本用法:

EXPLAIN + sql;
#如:EXPLAIN SELECT a.* FROM z_user 

二、能做什么

  • 确定表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询。

三、用法解析

MYSQL之explain详解
1、id:决定表的加载和读取顺序。
select查询的***,包含一组数字,表示查询中执行select子句或者操作表的顺序。有三种:

  • id 相同,执行顺序由上到下。
  • id不同 ,id越大优先级越高,越先被执行。(如,子查询id序号会递增)
  • id部分相同,id越大越先执行,相同的从上到下执行。

2、select_type主要使用分类:

  • SIMPLE 简单select查询,查询中不包含子查询或者union
  • PRIMARY 查询中若包含任何复杂的子部分,最外层则被标记为PRIMARY
  • SUBQUERY 在select 或者where列表中包含了子查询
  • DERIVED 在from列表中包含的子查询被标记为DERIVED (衍生)mysql会递归
    MYSQL之explain详解
  • UNION若 第二个select 出现在union之后,则被标记为union;若union包含在from 子句的子查询中,外层select将被标记为DERIVED
  • UNION RESULT 从 UNION表获取结果的select

3、table
table 这行数据是那张表的
4、type(更sql优化息息相关)
常用访问类型8种排序依次为:

system>const>eq_ref>ref>range>index>all
  • system :表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计
  • const:表示通过索引一次就找到了,const用于比较primary key或者unique索引,因为只匹配一行数据,所以很快,如将主键置于where列表中,mysql就能将改查询转换为一个常量。
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描。
  • ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,他返回所有匹配某个单独值的行,然而,它可能会找到多个复合条件的行,所以他应该属于查找和扫描的混合体。
  • range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪些索引,一般就是你的where语句中出现了between 、<、>、 in等的查询,这种范围扫描索引扫描要比全表扫描好,因为它值需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。
  • index :full index scan , index 与all 区别为index 类型只遍历索引树。这种通常比all快,因为索引文件通常比数据文件小。(也就是说虽然all 和index都是读全表),但是index 是从索引读取的,而all是从硬盘读取的。索引少io
  • all:full table scan ,将遍历全表以找到匹配的行
    5、possible_keys
    可能被使用到的索引
    6、key
    实际被使用到的索引
    **7、key_len **
    精度越高的情况下,长度越小越好
    8、ref
    显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。
    9、rows
    根据表统计信息有以及索引使用情况,大致估算出找到所需的记录所需要读取的行号。
    10、extra 十分重要的额外信息
  • using filesort说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。mysql中无法利用索引完成的排序操作成为“文件排序”

  • using tempory使用了临时表保存中间结果,mysql 在对查询结果排序时使用临时表。常见于order by和分组查询group by。

  • using index表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错;如果同时出现了using where,表明索引被用来执行索引键值的查找;如果没有出现了using where,表明索引用来读取数据并非执行查找动作。
    *Coving index覆盖索引,select数据列只用才从索引中就能够取得,不必读取数据行, MYSQL 可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。

MYSQL之explain详解

相关标签: MYSQL高级