EXPLAIN
explain 用来查看sql语句执行时的相关参数信息 从而分析sql的性能
-- 通过 EXPLAIN + SQL语句 ( 来查看sql执行时的相关信息 )
EXPLAIN SELECT * FROM x_test WHERE x_name = 'mashen';
结果:
id | select_type | table | partitions | type | possible_keys | key | ken_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | x_name | Null | ref | x_name | x_name | 30 | const | 3 | 100 | Using where |
字段解释
id:
sql语句的标识符 如果为Null 则表示这个sql是其他行的联合结果
select_type:
select_type 值 | 说明 |
---|---|
SIMPLE | 简单的查询(不包含子查询和union) |
PRIMARY | 包含子查询或union最外层部分为PRIMARY |
UNION | 在union第2个或者后面的sql为UNION 第一个为PRIMARY |
DEPENDENT UNION | 使用UNION并使第2个或后面的查询同时依赖于外部查询 |
UNION RESULT | 在匿名临时表里检索 |
SUBQUERY | 子查询中第一个SELECT |
DEPENDENT SUBQUERY | 子查询中第一个SELECT 同时依赖于外部查询 |
DERIVED | 子查询产生的临时表 FROM的表 |
table:
访问的表名称
partitions:
查询匹配的分区 NULL表示未进行分区
type:
访问类型
type 值 | 说明 | 效率 |
---|---|---|
ALL | 全表扫描 ( 最坏情况 ) | 最慢 |
index | 和ALL一样只是通过索引树扫描 | 很慢 |
range | 范围扫描 当使用> < IN BETWEEN 这种范围表达式时 | 一般 |
ref | 通过索引访问( 高效的 ) | 快速 |
eq_ref | 充分使用索引 ( 比ref还高效 ) | 很快 |
const | 只有一个匹配的行所以该行的列中的值可以被其他优化器视为常量所以非常快 | 非常快 |
system | 该表只有一行(=系统表)这是const的特殊情况 | 最快 |
possible_keys:
当前有可能会用到的索引 ( 并非实际用到的 )
key:
实际用到的索引
ken_len:
查询所使用索引的长度
ref:
使用哪些列或常量和key一起去匹配结果行
rows:
查询结果是必须要检查的行数
filtered:
在表中已条件过滤数据的百分比
Extra:
Extra