MySQL 查询优化器在基于成本和规则对一条查询语句进行优化后,会生成一个执行计划,这个执行计划展示了接下来执行查询的具体方式,比如多表连接的顺序是什么,采用什么访问方法来具体查询每个表等。
执行计划是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化。
在MySQL中使用 explain 关键字查看。
查询
SELECT * FROM A WHERE NAME = "TOM";
查看上述语句的执行计划
explain select * from A where name = "TOM";
select_type
该表示选择的类型,常见可选值有: SIMPLE(简单的),PRIMARY(最外层) ,SUBQUERY(子查询中的第一个select查询)table
无论我们的查询语句有多复杂,里面包含了多少个表,到最后也是对每个表进行单表访问。-
id
查询语句一般都以 SELECT 关键字开头,比较简单的查询语句只有一个 SELECT 关键字,但也有包含多个 SELECT 关键字的。
所以查询语句每出现一个SELECT 关键字,EXPLAIN 中记录就会分配一个ID,这个ID就是 EXPLAIN 输出的第一列。
-
type
该属性表示访问类型,有很多种访问类型。
最常见的其中包括以下几种:- ALL(全表扫描)
- index(索引扫描)
这种类型表示是MySQL会对整个索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个复合索引的一部分,MySQL都可能会采用index类型的方式扫描。缺点是效率不高,MySQL会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引。 - range(范围扫描)
- ref (非唯一索引扫描)
- eq_ref(唯一索引扫描,)
- (const)常数引用, 访问速度依次由慢到快。
访问速度依次由慢到快。
possible_keys
顾名思义,该属性给出了该查询语句可能走的索引,(如某些字段上索引的名字)这里提供的只是参考,而不是实际走的索引。key
显示MySQL实际使用的索引,其中就包括主键索引(PRIMARY),或者自建索引的名字。key_len
表示索引所使用的字节数。ref
连接匹配条件,如果走主键索引的话,该值为: const,全表扫描的话为null值-
rows
扫描行数,也就是说,需要扫描多少行,采能获取目标行数,一般情况下会大于返回行数。通常情况下:rows越小,效率越高,大部分SQL优化,都是在减少这个值的大小。注意: 理想情况下扫描的行数与实际返回行数理论上是一致的,但这种情况及其少,如关联查询,扫描的行数就会比返回行数大大增加。
Extra
这个属性非常重要,该属性中包括执行SQL时的真实情况信息,如上面所属,使用到的是"using where",表示使用where筛选得到的值。常用的有: "Using temporary" 使用临时表; "using filesort" 使用文件排序