数据库 EXPLAIN
explain用来解释查询语句的执行情况,是否使用到索引等等。
select version()
或select @@version
命令可以查看数据库的版本号:
5.7版本下,explain查询出来的结果列如下:
Column | Meaning |
---|---|
id | select标识符 |
select_type | select类型 |
table | 表名 |
partitions | 匹配的分区 |
type | 查询使用到的类型 |
possible_keys | 可能用到的索引 |
key | 实际用到的索引 |
key_len | 用到索引的长度 |
ref | 列与索引进行比较 |
rows | 估计要检查的行 |
filtered | 按表条件过滤的百分比 |
Extra | 额外的信息 |
以下是每一列具体的含义以及可能出现的值:
-
id:决定表的执行顺序,有三种情况
- id相同,表执行顺序由上到下,与sql中顺序无关;
- id不同,值越大优先级约高,越先被执行;
- id有相同的也有不同的,如果相同则认为是一组,由上到下执行,多个组id值越大越先执行。
-
select_type:查询类型,5.7版本中可能有如下值
select_type Value Meaning SIMPLE 简单查询,不使用union或子查询 PRIMARY 查询中包含任何union或子查询,最外层被标记为该类型 UNION 使用连接查询,第二个或更后面的select被标记为该类型 DEPENDENT UNION 使用连接查询,第二个或更后面的select被标记为该类型,而且依赖于外部的查询,也就是在子查询中使用的连接查询 UNION RESULT union查询的结果被标记为该类型 SUBQUERY 子查询中的第一个select被标记为该类型 DEPENDENT SUBQUERY 子查询中的第一个select被标记为该类型,而且依赖于外部的查询,也就是子查询中又包含子查询 DERIVED from后的子查询被标记为该类型(衍生),使用内联视图,递归执行这些子查询,把结果放在临时表中 MATERIALIZED 物化子查询 UNCACHEABLE SUBQUERY 不可缓存的子查询,对于外层的主表,子查询不可被物化,每次需要重新计算 UNCACHEABLE UNION 不可缓存的连接查询,连接的表不可被物化,每次需要重新计算 对于物化 的理解:物化通过将子查询结果作为一个临时表来加快查询执行速度,正常来说是在内存中的。mysql第一次需要子查询结果时,物化结果到一张表中,在之后的任何地方需要该结果集,mysql会再次引用临时表。
-
table:表名
-
partitions:分区,为null表示该表没有分区
-
type:查询用到的类型,以下结果由上到下,效果由最好到最差
type Value Meaning system 该表只有一行(等于系统表),是const类型的特例 const 表示通过索引一次就找到了结果,用于比较主键索引或唯一性索引 eq_ref 用于联表查询的情况,和const一样,也是只会匹配到一行 ref 非唯一性索引扫描,返回匹配某个值的所有行 fulltext 使用到的索引类型为全文索引 ref_or_null 非唯一性索引的列等于某个值或为null index_merge where条件中用到多个索引的首列,且这些条件之间用OR连接(或的关系) unique_subquery 索引查找函数,可以替换IN子查询提高效率,如下格式: value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery 替换IN子查询提高效率,如下格式: value IN (SELECT key_column FROM single_table WHERE some_expr)
range 只检索给定范围的行,一般where中使用between, <, >, in等会用到这种类型 index 全索引扫描,与all的区别为,index只遍历索引树 All 全表扫描 -
possible_keys:可能用到的索引
-
key:实际用到的索引,如果为null则没有使用索引
-
key_len:使用到的索引的长度
-
ref:显示索引的哪一列被使用了,一般为常量或条件中用到的列
-
rows:估算出找到所需的记录所需要读取的行数,每张表有多少行被查询
-
filtered:筛选的表行数的百分比
举例:如果rows是1000,filtered是50.00,则使用下表连接的行数为1000*50%=500
-
Extra:一些额外信息,以下为常见的信息
Extra Value Meaning Using where 取出数据之后再根据条件对比 Using index 使用索引访问数据 Using index conditio 使用索引过滤数据 Using temporary 使用临时表 Using filesort 无法利用索引完成排序 Using join buffer 将之前的数据存放在join buffer中 Impossible WHERE 条件不成立