explain命令用来查询sql语句的执行计划。使得我们可以针对sql查询语句进行优化。
例如:查看select * from test_user表的执行计划
>>> explain select * from test_user
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | test_user | null | ALL | null | null | null | null | 1 | 100.00 | null |
Id :
id值代表查询语句的优先级,当只有一条查询语句时,他的id值为1,当有多个查询语句时,例如包含子查询的查询语句,那么查询语句的优先级顺序会在id列中显示,id越大语句查询优先级越高,对于同一个id值的不同行,从上到下语句查询的优先级依次降低。
id的值可以为null,用来说明查询是其他行的联合结果,例如union。
select_type :
显示查询中每个select子句的查询类型。
- SIMPLE: 简单查询语句,不包含任何子查询或union查询等。
- PRIMARY:嵌套查询中代表最外层的select查询,union查询中代表最靠前的select查询。
- UNION:代表union查询中第二个及以后所有的select查询。
- DERIVED:代表嵌套查询中派生表对应的select查询语句(select...from (select ... from ...) )。
- UNION RESULT:代表union查询的结果。
- DEPENDENT UNION:依赖外部查询的,并且select_type满足UNION类型的select查询。
- SUBQUERY:代表子查询中的第一个select查询。
- DEPENDENT SUBQUERY:依赖外部查询的,并且select_type满足SUBQUERY类型的select查询。
table:
显示select查询的目标数据表及衍生出来的数据表。
partitions:[暂时不知道怎么用]
代表查询匹配的分区,对于没有分区的数据表,该值为null。
type:
type字段代表进行select查询时使用的扫描方法,通过该字段我们可以轻松的对查询语句进行优化。
type的属性值:
(1). ALL:全表扫描,查询性能最差,我们应该尽量避免type=ALL的查询。如果出现了ALL查询,我们可以通过为字段添加索引解决。
(2). index:全索引扫描,和ALL类型类似,但是他只扫描索引,不扫描数据。
(3). range:表示使用索引来查找指定范围的行,这种类型通常出现在=,<>,>=,<=,between,in等范围查询语句中。
(4). index_subquery:
(5). unique_subquery:
(6). index_merger:
(7). ref_or_null:
(8). fulltext:
(9). ref:通常出现于多表join查询中,用于匹配使用了非主键索引和非唯一索引的索引查找,或是使用了最左前缀规则索引的查询。
(10). eq_ref:通常出现在多表join查询中,对于前一个表的每一个结果,在后表中只有一个结果与之匹配。通常用在 = 查询中。
(11). const:针对主键和唯一索引的等值扫描查询,最多只返回一行数据。
(12). system:表中只有一条数据,是特殊的const类型。
possible_keys:
该字段表示在select查询时能够使用到的索引。
即使有些索引在possible_keys中出现,也不代表mysql一定会使用这些索引,具体使用哪些索引,在key字段体现。
key:
select查询真正使用到的索引。
key_len:
key_len显示mysql进行查询时使用的索引长度,这个值可以帮我们判断我们设置的索引是否在查询中被完全使用。
key_len计算规则:
char(n): n 字节长度
varchar(n): 如果是 utf8 编码, 则是 3 n + 2字节; 如果是 utf8mb4 编码, 则是 4 n + 2 字节.
TINYINT: 1字节
SMALLINT: 2字节
MEDIUMINT: 3字节
INT: 4字节
BIGINT: 8字节
DATE: 3字节
TIMESTAMP: 4字节
DATETIME: 8字节
ref:
select查询的过滤方法。
rows:
mysql认为他在执行select查询时必须检查的行数(预估值)。越少效率越高。
filtered:
这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例。
其他详细信息。
信息 | 含义 |
---|---|
Using filesort | mysql 没有使用索引进行查询结果排序,此时需要优化 |
Using temporary | 查询使用了临时表,查询效率不高,需要优化 |
Using index | 表示查询在索引中就能找到数据,不需要扫描数据表,效率较高 |
Using index condition | mysql可以在索引中执行like操作,减少了不必要的IO操作 |
Using where | 使用where语句来限制哪些行将与下一张表匹配或者是返回给用户 |
网友评论