列名 | 意义 |
---|---|
id | |
select_type | SELECT语句查询的类型 |
table | 查询列的出处 |
partitions | 如果是分区表,表示从哪个分区查,非分区表为null |
type | 表和前一张表的关联方式。也可以说是当前这张表会怎么去查询 |
possible_keys | 查询的时候可能被使用的索引 |
key | mysql真正决定用来查询的索引,(可以不是上面possible_keys中的值) |
key_len | 存储的索引的长度 |
ref | 从哪儿取值 |
rows | 需要查询的行数 |
filtered | |
Extra |
type描述的是在每个表的查询中如何连接的,既join
。一个sql查询可能涉及到多个表的相互连接。从最好的到最差的。
-
system
这个表只有一行(既系统表),这是const
类型的一种特殊形式 -
const
这个表最多只有一行符合条件的匹配的行,而且是第一个被查询的table,因为只有一行数据,这行里面的各个列的值可以被当做constants
常量,被后面的优化器使用。
当我们用一个确定的值去和主键或者唯一索引去比价时,mysql就是const。(因为他可以直接在b+tree里快速找到此值,只需要一次从顶到底的查找)。注意必须是索引的全部,而不是部分。所以当我们的查询是主键/唯一索引等号比较时,是最快的。只需要一次查找即可。 -
eq_ref
跟const其实是一样的,不过他不是第一个被查询的,而是被其他表连接的时候。假设学生表和地址表一对一,下面这个sql输出中,注意第二行查找address表时的type就是eq_ref。也就是说每次student表查找到一条后,再去查address表的时候,只需要查找一次。因为查找address表用的是前一张student表的user中的address的主键。
EXPLAIN SELECT * FROM student LEFT JOIN address ON student.addr_id = address.id;
`
-
ref
代表当期表数据查找并非基于主键或者唯一非空索引(既不能准确的找到唯一的一个值) -
fulltext
长文本索引相关 -
ref_or_null
类似ref,但是查询需要再来一遍去查询对应列内容为null的数据行。如下:SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
-
unique_subquery
eq_ref 用于in条件子句 -
index_subquery
任然是用于in条件子句,只不过相对于unique_subquery
这种查询代表着非unique的in条件 -
range
range代表着无法确定个数的范围查询,走索引查询。在以下条件中都可能用到。
=,<>,>,>=,<,<=,IS NULL,<=>,BETWEEN,LIKE,IN()
-
index
扫描表用的是索引时,显示此字段。具体又分2种情况。
1.覆盖索引。需要的列在索引中有,此时Extra
列会显示using index
,不需要进行全表扫描。
2.使用了索引,但是还是需要走到叶子节点,读取具体的表数据。这种情况Extra
列不会显示using index
。
MySQL can use this join type when the query uses only columns that are part of a single index. -
all
全表扫描。既扫描条件没有现成的索引,查询只能通过扫描表得到数据。是最差的情况。
Extra
这个列会文本化提供一些关键信息,用于优化考虑。
比如出现 Using filesort
和Using temporary
应该重点小心。
Range checked for each record (index map: N)
网友评论