执行计划
为了优化Sql语句的执行,需要查看Sql的具体执行过程,以加快Sql语句的执行效率。可以使用explain+sql语句来模拟优化器执行sql查询语句,从而了解mysql是如何处理sql语句的。
执行计划中包含的相关信息:
| 属性 | 含义 |
|---|---|
| id | select查询的***,表示查询中执行select字句或操作表的顺序 |
| select_type | select语句的类型,主要区分普通查询、联合查询、自查询等 |
| table | 表名称 |
| type | 访问类型,以何种方式去访问数据 |
| possible_keys | 显示可能应用在这张表中的索引,一个或多个 |
| key | 实际使用的索引 |
| key_len | 索引中使用的字节数 |
| ref | 显示索引的哪一列被使用了,如果可能的话,是一个常数 |
| rows | MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数 |
| extra | 辅助的额外信息 |
id
select查询的***,包含一组数字,表示查询中执行select子句或者操作表的顺序。
- id相同,执行顺序从上到下
- id不同,如果是自查询,id的序号会递增,id值越大,优先级越高,越先被执行
- 相同和不同的id值同时存在,相同的被认为是一组,从上至下执行,所有组中,id值越大,优先级越高,越先执行
select_type
用来区分查询的类型
SIMPLE:简单的查询,不包含自查询和union。
PRIMARY:查询中包含任何的复杂查询,最外层查询被标记为primary。
UNION:如果第二个select出现在union之后,则被标记为union。
UNION RESULT:从union表获取结果的select。
SUBQUERY:在select或where列表中包含的自查询。
DERIVED:from子句中出现的自查询,也叫做派生类。
UNCACHEABLE SUNQUERY:表示自查询的结果不能被缓存。
table
对应的行在访问的表名或别名,有可能是临时表或union的结果。
- 如果是具体的表名,表示从实际存在的物理表中获取数据,也可以是表的别名;
- 如果表名是derivedN的形式,表示使用了id为N的查询产生的衍生表;
- 当有union result的时候,表名是union n1,n2等形式,n1,n2表示参与union等id。
type
访问类型,表示用什么样的方式访问数据。
- all:全表扫描,一般情况这样的sql使用的数据量较大就需要优化;
- index:全索引扫描,这个比all的效率好,主要有两种情况,一种是需要的数据在索引中可以获取,或者是使用索引进行排序,这样避免了数据的重新排序;
- range:表示使用索引查询的时候限定了范围,在指定的范围内查询,避免了index的全索引扫描,适用的操作符:>、<、=、>=、<=、<>、IS NULL、LIKE、IN();
- index_subquery:利用索引关联自查询,不在扫描全表;
- index_merge:查询过程有多个索引组合使用;
- ref_of_null:对于某个字段既需要关联条件,也需要null值的情况下,查询优化器会选择这种访问方式;
- ref:使用非唯一索引进行数据查询;
- eq_ref:使用唯一索引进行数据查询;
- const:这个表最多有一个匹配行;
- system:表只有银行记录,属于const的特例。
possible_keys
显示可能应用在这张表中的索引,一个或者多个。查询涉及到的字段上若存在索引,则会被列出,但是不一定在查询中实际使用。
key
在查询中实际使用的索引,如果是null,则没有使用索引。
key_len
表示索引中使用的字节数,可以通过key_len计算查询中使用的索引长度,在不损失精度的情况下,长度越短越好。
rows
MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,这个值是不准确的。反应了sql找了多少条数据。