目录
- 1. 说明
- 2. id
- 3. select_type
- 4. table
- 5. partitions
- 6. type
- 7. possible_keys
- 8. key
- 9. key_len
- 10. ref
- 11. rows
- 12. filtered
- 13. Extra
1. 说明
- 1.EXPLAIN执行计划是MySQL中用于分析查询语句性能的重要工具。
- 2.它展示了MySQL如何处理SQL语句,包括表的读取顺序、数据读取操作类型、可能及实际使用的索引等。
2. id
- 1.含义:SELECT查询的序列号,表示查询中执行SELECT子句或操作表的顺序。
- 2.解释:每个SELECT关键字都对应一个唯一的id值。在简单的查询中,id通常为1。在复杂的查询中,如包含子查询或UNION的查询,每个SELECT关键字都会被分配一个唯一的id值,以表示其执行顺序,通常第一个select的id值最小。
3. select_type
- 1.含义:查询的类型,用于区分普通查询、联合查询、子查询等。
- 2.常见类型:SIMPLE(简单查询,不包含子查询和UNION)、PRIMARY(最外层查询,若包含复杂子查询,则最外层被标记为PRIMARY)、UNION(UNION中的第二个及后续SELECT被标记为UNION)、SUBQUERY(在SELECT或WHERE列表中包含的子查询)、DERIVED(在FROM列表中包含的子查询,也叫做派生类)等。
4. table
- 1.含义:表示EXPLAIN语句正在访问的表名或别名。
- 2.解释:它可能是具体的表名,表示从实际的物理表中获取数据;也可能是表的别名;或者是以derivedN的形式表示使用了id为N的查询所产生的衍生表;当存在UNION RESULT时,表名可能是union n1,n2等的形式,表示参与UNION的id。
5. partitions
- 1.含义:匹配的分区信息。
- 2.解释:对于分区表,该字段显示查询正在访问的分区。如果查询未涉及分区表,则该字段值为NULL。
6. type
- 1.含义:访问类型,表示以何种方式访问数据库。
- 2.常见类型(按效率从高到低):system(表只有一行记录,是const类型的特例)、const(最多匹配一条数据,通常使用主键或唯一索引进行等值查询)、eq_ref(等值联表查询时使用主键索引或唯一性非空索引)、ref(使用非唯一性索引进行查找)、range(利用索引查询时限制了范围)、index(全索引扫描)、ALL(全表扫描)。
- 3.解释:type字段是评估查询效率的重要指标。通常,我们希望查询能够使用到range级别及以上的访问方式,以避免全表扫描和全索引扫描的低效操作。
7. possible_keys
- 1.含义:显示查询可能使用的索引。
- 2.解释:它列出了查询可能应用的索引。这些索引是基于查询涉及的字段上存在的索引。然而,这些索引并不一定被查询实际使用。
8. key
- 1.含义:实际使用的索引。
- 2.解释:它显示了MySQL实际采用哪个索引来优化对该表的访问。如果为NULL,则表示没有使用索引。
9. key_len
- 1.含义:索引中使用的字节数。
- 2.解释:它表示查询中实际使用的索引长度。索引的大小会影响IO操作的次数和量,从而影响执行效率。因此,在可能的情况下,应选择长度较短的索引。
10. ref
- 1.含义:当使用索引列等值查询时,与索引列进行等值匹配的对象信息。
- 2.解释:它显示了使用索引列进行等值查询时,与索引列匹配的列或常量值。
11. rows
- 1.含义:预估的需要读取的记录条数。
- 2.解释:它是基于表的统计信息和索引使用情况,对找出所需记录所需读取的数据行数进行的大致估算。这个值对于评估查询效率非常重要。
12. filtered
- 1.含义:某个表经过搜索条件过滤后剩余记录条数的百分比。
- 2.解释:它是对表中符合某个条件(如WHERE子句或连接条件)的记录数所占百分比的一个悲观估算。
13. Extra
- 1.含义:一些额外的信息。
- 2.常见信息:Using index(表示当前的查询是覆盖索引的,直接从索引中读取数据,而不用访问数据表)、Using where(表示使用WHERE子句进行条件过滤)、Using temporary(表示建立临时表来保存中间结果)、Using join buffer(表示使用连接缓存)、Impossible WHERE(表示WHERE语句的结果总是false)等。
- 3.解释:Extra字段包含了其他列无法涵盖的重要信息,对于深入理解查询的执行过程和优化策略具有重要意义。