Explain是什么?
一条查询语句在经过MySQL查询优化器优化
后生成一个所谓的执行计划
,这个执行计划展示了接下来具体执行查询的方式,比如对于每个表采用什么访问方法来具体执行查询等等。
EXPLAIN
可以帮助我们查看某个查询语句的具体执行计划.
EXPLAIN语句输出的各个列的作用:
执行计划详解
准备工作:建两张表s1、s2
,里有10000条记录,除id列外其余的列都插入随机值。
CREATE TABLE s1/s2(
id INT NOT NULL AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
KEY idx_key1 (key1),
UNIQUE KEY idx_key2 (key2),
KEY idx_key3 (key3),
KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;
select_type
MySQL为每一个SELECT关键字代表的小查询都定义了一个称之为select_type的属性,只要知道了某个小查询的select_type属性,就知道了这个小查询在整个大查询中扮演了一个什么角色
select_type主要的几个属性如下:
1、SIMPLE
查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型,比方说下边这个单表查询的select_type的值就是SIMPLE:
2、PRIMARY
对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY,比方说:
从结果中可以看到,最左边的小查询SELECT * FROM s1对应的是执行计划中的第一条记录,它的select_type值就是PRIMARY。
3、UNION
对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION,可以对比上一个例子的效果,这就不多举例子了。
还有其他的一些属性,相对比较少见就不一一介绍了;
table
table列代表该表的表名
id
查询语句中每出现一个SELECT
关键字,就会为它分配一个唯一的id值
,来唯一标识这个查询语句
type(核心)
possible_keys和key
possible_keys
列表示可能用到的索引
有哪些,key
列表示实际用到的索引
有哪些,比方说下边这个查询:
key_len
key_len
列表示当优化器决定使用某个索引执行查询时,该索引记录的最大长度
比如下边这个查询:
ref
当使用索引列等值匹配的条件去执行查询时,ref列展示的就是与索引列作等值匹配的是什么
可以看到ref列的值是const,表明在使用
idx_key1索引
执行查询时,与key1列作等值匹配的对象是一个常数
rows
rows表示预计需要扫描的行数
- 如果查询优化器决定使用
全表扫描
的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数
, - 如果使用
索引
来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数
。
比如下边这个查询:
我们看到执行计划的rows列的值是266,这意味着查询优化器在经过分析使用idx_key1
进行查询的成本之后,觉得满足key1 > 'z'
这个条件的记录只有266条。