mysql> explain select * from a,b where a.a_id = b.a_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| 1 | SIMPLE | b | NULL | ALL | b_to_a | NULL | NULL | NULL | 3 | 100.00 | Using where |
| 1 | SIMPLE | a | NULL | eq_ref | PRIMARY | PRIMARY | 8 | db_name.b.a_id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
2 rows in set, 1 warning (0.06 sec)
mysql> explain select * from a,b where a.a_id = b.a_id \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: b
partitions: NULL
type: ALL
possible_keys: b_to_a
key: NULL
key_len: NULL
ref: NULL
rows: 3
filtered: 100.00
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: a
partitions: NULL
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: db_name.b.a_id
rows: 1
filtered: 100.00
Extra: NULL
2 rows in set, 1 warning (0.00 sec)
id:查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序;
id相同,执行顺序从上至下,如例子表示先加载b再加载a;
id递增,越大越先被执行
id有相同有不同:越大越先被执行,相同的再顺序执行。
select_type:查询类型,主要用来区别是普通查询、联合查询、子查询、复杂查询
simple:只有一个select,无子查询或者union
primary:如果包含子查询,那么外层是primary
subquery: 子查询
derived:衍生表,子查询的结果
union:含有union关键字
union result:从union表中获取结果(join的双外结果)
type:访问类型,确定是否使用了优化
all index range ref eq_ref const,system NULL
最好到最差:
system >const > eq_ref > ref > range > index > all(当百万级别时,全表查询默认值就是all)
一般来说,在开发中能保证时range 或者 ref 级别就可以了。
system:当表只有一行记录时,是system
const:通过index1次找到,经常出现在主键索引或者唯一索引中,如子查询中的条件是唯一的一个数值。
eq_ref:唯一性索引扫描,意思是拿唯一性索引找到后结果只有一条
ref:非唯一性索引扫描,相对于上一个eq_ref,返回匹配某个值的所有行
range:只给定范围的查询,如between..and,in,>,<等。
index:使用了index的扫描查询。
possible_keys:列出查询中可能用到的索引
key:
(1)是否用到了索引
(2)实际用到了哪些索引。如果结果是NULL,表示可能没有建索引,也可能索引失效
key_len:表示查询时可能用到的索引长度
ref:显示索引的哪一列被使用了。
rows:根据表的信息以及使用索引的情况估算出大致需要查询的行数
extra:包含不适合在其他列中显示但是又十分重要的额外信息
using filesort:mysql中无法利用索引完成的排序被称为“文件排序”,经常出现在创建了复合索引但是却没有按顺序使用的情况。
using tempoprary:使用了临时表,常见于order by 和group by
using index:使用了索引,是个好消息
using where:使用了where条件查询,如果和using index一起出现就是好现象
using join buff:使用了缓冲,配置文件的值可以适当调大
impossiable where:where子句的值总是false