MySQL Explain详解
发布日期:2025-04-15 09:32:17 浏览次数:7 分类:精选文章

本文共 2167 字,大约阅读时间需要 7 分钟。

MySQL EXPLAIN命令详解

EXPLAIN命令是一个强大的工具,用于分析和优化MySQL查询性能。通过EXPLAIN命令,可以深入了解MySQL如何执行查询,从而找到性能瓶颈并采取改进措施。

EXPLAIN命令的使用

要使用EXPLAIN命令,执行以下语句:

EXPLAIN EXTENDED sql_statement;

执行后,执行以下命令查看警告信息:

SHOW WARNINGS;

EXPLAIN输出字段解释

EXPLAIN命令输出的字段如下表所示:

列名 说明
id 查询序号
select_type 查询类型
table 引用到的表名
partitions 匹配的分区
type 联接类型
possible_keys 可能使用的索引列名
key 实际使用的索引列名
key_len 索引的长度(单位:字节)
ref 与索引列比较的字段或常数值
rows 要检索的行数(估算值)
filtered 查询条件过滤的行数百分比(仅在EXPLAIN EXTENDED中显示)
Extra 额外信息,包括优化策略的使用情况

各字段详解

1. id字段

  • 查询序号。
  • id越大的SELECT语句最先执行。
  • 如果是UNION查询,id为NULL。

2. select_type字段

  • 查询类型,包括:
    • SIMPLE:简单SELECT,不使用UNION或子查询。
    • PRIMARY:最外层的SELECT。
    • UNION:UNION中第二个或之后的SELECT。
    • DEPENDENT UNION:UNION中的查询依赖于外部查询。
    • UNION RESULT:UNION查询结果。
    • SUBQUERY:子查询中的第一个SELECT。
    • DEPENDENT SUBQUERY:子查询中的SELECT依赖于外部查询。
    • DERIVED:衍生表(来自FROM子句的子查询)。
    • MATERIALIZED:物化子查询。
    • UNCACHEABLE SUBQUERY:无法缓存的子查询。
    • UNCACHEABLE UNION:无法缓存的UNION子查询。

3. table字段

  • 输出行所引用的表名。
  • 可能包含以下值:
    • <unionM,N>:引用M和N的UNION结果。
    • <derivedN>:引用派生表的结果(派生表来自FROM子句的子查询)。
    • <subqueryN>:引用子查询结果物化得到的表。

4. partitions字段

  • 查询匹配到的分区。
  • 只有在使用PARTITIONS关键字时才显示,否则为NULL。

5. type字段

  • 联接类型,从最优到最差的顺序:
    • system:表中只有一行数据。
    • const:最多只有一行匹配,查询开始时读取。
    • eq_ref:多表join时,当前表中每行只能找到一行。
    • ref:当前表中可能有多行匹配。
    • fulltext:使用全文索引。
    • ref_or_null:与ref类型类似,但允许 NULL 值。
    • index_merge:使用索引合并优化。
    • unique_subquery:替代eq_ref类型的IN子查询。
    • index_subquery:替代IN子查询的非唯一索引。
    • range:使用索引查询特定范围的记录。
    • index:通过索引树检索数据。
    • ALL:全表扫描。

6. possible_keys字段

  • 可能使用的索引列名。
  • 如果值为NULL,表示没有合适的索引。

7. key字段

  • 实际使用的索引列名。
  • 可能与possible_keys不同。

8. key_len字段

  • 索引的长度(单位:字节)。
  • 通过key_len值可以确定使用了联合索引的哪部分。

9. ref字段

  • 与索引列比较的字段或常数值。
  • 如果值为func,表示使用了函数结果。

10. rows字段

  • 估算要检索的行数。
  • InnoDB表的估算值可能不准确。

11. filtered字段

  • 查询条件过滤的行数百分比(仅在EXPLAIN EXTENDED中显示)。

12. Extra字段

  • 优化策略的使用情况,包括:
    • Using filesort:需要额外排序。
    • Using index:只从索引树中获取数据。
    • Using index for group-by:通过索引获取GROUP BY或DISTINCT数据。
    • Using index condition:使用Index Condition Pushdown优化。
    • Using join buffer:使用Block Nested Loop或Batched Key Access。
    • Using MRR:使用Multi-Range Read优化。
    • Using sort_union/intersect/union:索引合并优化的具体算法。
    • Using temporary:创建临时表。
    • Using where:WHERE子句限制了记录的返回。

Profiling的使用

通过Profiling可以分析查询性能:

  • SHOW PROFILE:查看单条查询的详细信息。
  • SHOW PROFILES:查看最近执行的所有查询。
  • Profiling默认关闭,可以通过SET profiling = 1;打开。

总结

通过EXPLAIN命令和Profiling工具,可以深入了解MySQL查询性能问题,从而制定有效的优化策略。

上一篇:mvc 添加控制器时运行所选代码生成器出错,未能加载文件或者程序集或他的一个依赖项
下一篇:mysql explain执行计划详解

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月29日 12时22分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章