MYSQL之explain详解
程序员文章站
2024-03-23 15:42:16
...
一、基本用法:
EXPLAIN + sql;
#如:EXPLAIN SELECT a.* FROM z_user
二、能做什么
- 确定表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询。
三、用法解析
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会递归
-
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列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。