Mysql使用EXPLAIN查看执行计划

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

可以做的事情: 

  1. 表的读取顺序

  2. 数据读取操作的操作类型

  3. 哪些索引可以使用

  4. 哪些索引被实际使用

  5. 表之间的引用

  6. 每张表有多少行被优化器查询

语法:EXPLAIN + SQL,如 EXPLAIN select * from article;

关键信息:id、select_ type、table、type、possible_ keys、key、key_ len、ref、rows、Extra

目录

id:

select_ type:

TYPE:

possible_ keys、key、Key_len:

ref:

rows:

Extra:


id:

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

三种情况:

  1. id相同,执行顺序由上至下,
  2. id不同,如果是子查询,id的序号会递增,id值 越大优先级越高,越先被执行
  3. id相同不同,同时存在

select_ type

查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

值:

  1. SIMPLE:简单的select查询,查询中不包含子查询或者UNION
  2. PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为
  3. SUBQUERY:在SELECT或WHERE列表中包含了子查询
  4. DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。
  5. UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为: DERIVED
  6. UNION RESULT:从UNION表获取结果的SELECT

TYPE

访问类型排列,显示查询使用了何种类型,
从最好到最差依次是:system>const>eq_ ref>ref>range>index>ALL

  1. ALL:全表扫描,意味着你的sql语句处于一种最原生的状态,有很大的优化空间。
  2. index:另外一种形式的全表扫描,加了索引。
  3. range:范围的索引扫描,出现range,则一定是基于索引。
  4. ref:查找条件列使用了索引而且不为主键和unique,有多条。
  5. eq_ ref:索引查找且只有一条数据,一般索引列是唯一的。
  6. const:主键在where后面的查询。
  7. systen:表中只有一条数据。

possible_ keyskey、Key_len

 possible_ keys:理论上使用到的索引

 key:实际使用的索引,

Key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好
key_ len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_ len是 根据表定义计算而得,不是通过表内检索出的

值如果为null:未使用、未建立、失效

ref

格式:库.表.列

显示索引的哪一列被使用了,有时候会是一个常量:表示哪些列或常量被用于用于查找索引列上的值

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。 

Extra

 额外的信息说明

猜你喜欢

转载自blog.csdn.net/qq_39648029/article/details/106569811