explain就是SQL的执行计划,通过执行计划,我们可以了解sql的执行当中的一些细节。
使用方法为在SQL语句前加explain
得到结果如下:
mysql> explain select id,c1 from t1 where c1=4398825;
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 4992210 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
各列功能如下:
- id: 按照sql语法解析后分层后的编号,可能重复
- select_type:
- SIMPLE,简单的select查询,不使用union及子查询
- PRIMARY,最外层的select查询
- UNION,UNION 中的第二个或随后的 select 查询,不依赖于外部查询的结果集
- DEPENDENT UNION,UNION 中的第二个或随后的 select 查询,依赖于外部查询的结果集
- SUBQUERY,子查询中的第一个 select 查询,不依赖于外部查询的结果集
- DEPENDENT SUBQUERY,子查询中的第一个 select 查询,依赖于外部查询的结果集
- DERIVED,用于 from子句里有子查询的情况。 MySQL会递归执行这些子查询, 把结果放在临时表里。
- UNCACHEABLE SUBQUERY,结果集不能被缓存的子查询,必须重新为外层查询的每一行进行评估。
- UNCACHEABLE UNION,UNION 中的第二个或随后的 select 查询,属于不可缓存的子查询
- SIMPLE,简单的select查询,不使用union及子查询
- table:涉及的表,如果SQL中表有赋别名,这里出现的是别名
- type:
- system,从系统表读一行。这是const联接类型的一个特例。
- const,表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
- eq_ref,查询条件为等于
- ref,条件查询不等于
- ref_or_null,同ref(条件查询),包含NULL值的行。
- index_merge,索引联合查询
- unique_subquery,利用唯一索引进行子查询
- index_subquery,用非唯一索引进行子查询
- range,索引范围扫描
- index,索引全扫描
- ALL,全表扫描。
- system,从系统表读一行。这是const联接类型的一个特例。
- possible_keys:可能使用的索引
- key:sql中使用的索引
- key_len:索引长度
- ref:使用哪个列或常数与key一起从表中选择行。
- rows:显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
- Extra:该列包含MySQL解决查询的详细信息。
- Distinct,去重,返回第一个满足条件的值
- Not exists 使用not exists查询
- Range checked for each record,有索引,但索引选择率很低
- Using filesort,有序查询
- Using index,索引全扫描
- Using index condition,索引查询
- Using temporary,临表表检索
- Using where,where条件查询
- Using sort_union,有序合并查询
- Using union,合并查询
- Using intersect,索引交叉合并
- Impossible WHERE noticed after reading const tables,读取const tables,查询结果为空
- No tables used,没有使用表
- Using join buffer (Block Nested Loop),使用join buffer(BNL算法)
- Using MRR(Multi-Range Read ) 使用辅助索引进行多范围读
- Distinct,去重,返回第一个满足条件的值
转载自:https://segmentfault.com/a/1190000006726948#articleHeader14