在 Navicat 中,执行 EXPLAIN 语句可以分析 SQL 查询的执行计划,帮助优化查询性能。以下是 Navicat 中 EXPLAIN 结果各列的详细解释:

1. id(查询标识符)

  • 含义:查询的唯一标识符,标识 SQL 语句的执行顺序。
  • 规则
    • id 相同:按 FROMWHEREGROUP BY 等子句顺序执行。
    • id 不同:id 值越大,优先级越高,越先执行。

2. select_type(查询类型)

  • 常见值
    • SIMPLE:简单查询(不包含子查询或 UNION)。
    • PRIMARY:主查询(包含子查询的外层查询)。
    • SUBQUERY:子查询。
    • DERIVED:派生表(FROM 子句中的子查询)。
    • UNION:UNION 操作的第二个及后续查询。

3. table(表名)

  • 含义:当前执行计划涉及的表名,可能是实际表名或别名。
  • 特殊情况
    • <derivedN>:表示由 id=N 的子查询生成的临时表。
    • <unionM,N>:表示 UNION 操作中 id=M 和 id=N 的结果合并。

4. type(连接类型,重要!)

  • 含义:表示查询使用的索引类型,反映查询效率(从优到差):

    • system:表中只有一行记录(系统表),是 const 的特例。
    • const:通过主键或唯一索引精确匹配一行记录(效率最高)。
    • eq_ref:每行数据都通过主键或唯一索引与其他表连接。
    • ref:使用非唯一索引或索引前缀匹配,返回多行数据。
    • range:使用索引进行范围查询(如 WHERE id BETWEEN 1 AND 10)。
    • index:全索引扫描(遍历整个索引树)。
    • ALL:全表扫描(效率最低)。
  • 优化目标:尽量将 type 优化到 ref 或更高。

5. possible_keys(可能使用的索引)

  • 含义:MySQL 认为可能用于执行查询的索引。
  • 注意:即使显示了索引,也不代表实际会使用。

6. key(实际使用的索引)

  • 含义:MySQL 实际选择的索引。
  • 特殊值
    • NULL:未使用索引(可能是全表扫描)。

7. key_len(索引使用的字节数)

  • 含义:表示索引使用的长度,反映索引的精确程度。
  • 计算规则
    • 对于 VARCHAR(100) 且 CHARSET=utf8mb4
      • 若索引覆盖整个字段,key_len = 100 * 4 + 2 = 402(4 字节 / 字符 + 2 字节长度前缀)。
      • 若索引只使用前 20 个字符,key_len = 20 * 4 + 2 = 82

8. ref(索引匹配的列或值)

  • 含义:显示哪些列或常量被用于与索引匹配。
  • 示例
    • const:使用常量值匹配索引。
    • table.column:使用其他表的列匹配索引。

9. rows(估计扫描的行数)

  • 含义:MySQL 估计执行查询需要扫描的行数,非精确值
  • 作用:评估查询效率,值越小越好。

10.filtered  (满足记录条数占比)

  • 含义满足当前索引条件的记录数 占 上一步操作扫描的记录数(即 rows 值) 的百分比。
  • 作用:评估查询效率,先看rows,rows一定的情况下,值越小越好。

11. Extra(额外信息,重要!)

  • 常见值
    • Using index:使用覆盖索引(索引包含所有需要查询的字段),无需回表。
    • Using where:使用 WHERE 子句过滤数据。
    • Using filesort:需要文件排序(未利用索引排序),性能较差。
    • Using temporary:使用临时表(如 GROUP BY 或 DISTINCT),性能开销大。
    • Range checked for each record (index map: N):没有可用的索引,对每一行都要重新评估索引。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐