MySQL explan参数详细解读

MySQL的EXPLAIN语句用于分析SQL查询的执行计划,它返回的结果有助于理解MySQL如何处理和优化查询。以下是EXPLAIN结果中各列参数的详细解读:

  1. id

    • 标识SQL查询中的每个部分(例如子查询、联合查询等)的顺序。
    • 值越大表示该部分在执行序列中的优先级越低(并不是绝对意义上的执行顺序)。
    • 相同id值的部分属于同一个查询块,并按从上到下的顺序执行。
    • 如果存在嵌套关系,MySQL会先执行id值较小的查询块。
  2. select_type

    • 描述SELECT类型,可能的值包括:
      • SIMPLE:简单SELECT,没有子查询或UNION。
      • PRIMARY:外部查询(如果存在子查询,则外部的大查询为PRIMARY)。
      • SUBQUERY:出现在FROM子句中的子查询。
      • DERIVED:由FROM子句中的子查询派生出来的临时表(即“物化子查询”)。
      • UNION / UNION RESULT:UNION操作符相关的查询或者结果集。
  3. table

    • 当前正在访问的表名,对于复杂的JOIN操作,会显示多个表格。
  4. partitions(如果启用分区功能):

    • 指定查询涉及到的分区信息。
  5. type

    • 访问类型,指示MySQL是如何查找行的,性能好坏排序如下(最优至最差):
      • system: 基于系统表,只有一行数据。
      • const: 使用唯一索引,常量引用,通常对应一行记录。
      • eq_ref: 对于每个来自于前面的表的行组合,从该表中读取一行,使用了索引,且索引的所有部分都被用作比较。
      • ref: 使用非唯一索引或唯一索引的一部分进行查找,与某一个或几个列相比较。
      • fulltext: 全文索引检索。
      • ref_or_null: 类似ref,但还包括对NULL值的搜索。
      • index_merge: 使用了两个以上索引合并查找。
      • unique_subquery: 对于IN子查询,使用了唯一索引子查询。
      • index_subquery: 对于IN子查询,使用了索引子查询。
      • range: 索引范围扫描,使用索引来限制检索行的范围。
      • index: 全索引扫描,覆盖索引访问而不需要回表。
      • ALL: 全表扫描,不使用任何索引。
  6. possible_keys

    • 查询时可能使用的索引列表。
  7. key

    • 实际选择使用的索引,如果为NULL则表示没有使用索引。
  8. key_len

    • 表示实际使用的索引长度,对于复合索引来说,这个值可以用来判断使用到了哪些列。
  9. ref

    • 显示使用哪个字段或常量与key一起进行查找。
  10. rows

    • MySQL根据统计信息估算出需要检查的行数,用于评估查询成本。
  11. filtered

    • 结果集过滤后的预计百分比,表示存储引擎返回的数据中有多少比例符合WHERE条件。
  12. Extra

    • 提供额外的信息,如:
      • Using index:仅通过索引获取所需列,无需回表(覆盖索引)。
      • Using where:WHERE子句用于筛选行。
      • Using temporary:创建了临时表来处理查询。
      • Using filesort:无法利用索引完成排序,因此进行了外部排序。
      • Using join buffer (Block Nested Loop):使用连接缓存进行块嵌套循环连接操作。
      • ...还有其他许多提示信息。

通过对EXPLAIN结果的深入解读,可以帮助我们发现查询的潜在性能瓶颈并采取相应措施进行优化,比如添加合适的索引、调整查询结构或者更新统计信息等。

你可能感兴趣的:(mysql,数据库)