博客
关于我
MySQL Explain详解
阅读量:798 次
发布时间:2023-02-10

本文共 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查询性能问题,从而制定有效的优化策略。

转载地址:http://phffk.baihongyu.com/

你可能感兴趣的文章
NIO蔚来 面试——IP地址你了解多少?
查看>>
NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
查看>>
NISP国家信息安全水平考试,收藏这一篇就够了
查看>>
NIS服务器的配置过程
查看>>
NIS认证管理域中的用户
查看>>
Nitrux 3.8 发布!性能全面提升,带来非凡体验
查看>>
NiuShop开源商城系统 SQL注入漏洞复现
查看>>
NI笔试——大数加法
查看>>
NLog 自定义字段 写入 oracle
查看>>
NLog类库使用探索——详解配置
查看>>
NLP 基于kashgari和BERT实现中文命名实体识别(NER)
查看>>
NLP 时事和见解【2023】
查看>>
NLP 模型中的偏差和公平性检测
查看>>
Vue3.0 性能提升主要是通过哪几方面体现的?
查看>>
NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
查看>>
NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
查看>>
NLP、CV 很难入门?IBM 数据科学家带你梳理
查看>>
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
查看>>
NLP入门(六)pyltp的介绍与使用
查看>>
NLP学习笔记:使用 Python 进行NLTK
查看>>