it编程 > 数据库 > Mysql

mysql中explain的具体实现

9人参与 2026-03-17 Mysql

一、mysql explain 是什么?

explain 是 mysql 中用于分析 sql 执行计划的核心命令,它能告诉你 mysql 优化器会如何执行这条 sql(比如用什么索引、扫描多少行、连接方式等),是优化慢 sql 的必备工具。

可以把它理解为:你写了一条 sql 想让 mysql 执行,explain 会提前告诉你 mysql 的“执行思路”—— 走哪条路、做哪些操作、效率怎么样,帮你找到 sql 里的性能瓶颈。

二、基本用法

1. 语法

explain + 你的sql语句;
-- 示例
explain select * from user where id = 1;

如果想查看更详细的执行计划(比如执行时的成本、临时表等),可以用:

explain analyze select * from user where id = 1; -- mysql 8.0 及以上支持

2. 输出字段说明

执行 explain 后会返回一个结果集,核心字段如下(新手先掌握这 8 个核心字段即可):

字段核心含义
idsql 执行的顺序(子查询/联表时会有多个 id,数字越大越先执行)
select_type查询类型(比如简单查询、子查询、联表查询、衍生表等)
table本次执行涉及的表名
type访问类型(核心!判断性能的关键,从差到好:all < index < range < ref < eq_ref < const/system)
possible_keysmysql 可能会选择的索引(候选索引)
keymysql 实际使用的索引(如果为 null,说明没用到索引)
rowsmysql 预估要扫描的行数(数值越小越好)
extra额外信息(比如 using index 走覆盖索引、using where 过滤条件、using filesort 排序等)

三、核心字段详解(新手重点)

1. type(访问类型)

这是 explain 中最重要的字段,直接反映 sql 的性能层级,常见值从差到优排序:

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

3. extra(关键提示)

示例:user 表有索引 idx_name_age (name, age),执行 explain select name, age from user where name = '张三';,extra 会显示 using index。

四、实战示例

假设有一张 user 表,结构如下:

create table `user` (
  `id` int primary key auto_increment,
  `name` varchar(20) not null,
  `age` int,
  `gender` tinyint,
  index `idx_name` (`name`) -- 普通索引
);

示例 1:全表扫描(差)

explain select * from user where age = 20;

示例 2:使用索引(好)

explain select * from user where name = '张三';

示例 3:覆盖索引(优)

explain select name from user where name = '张三';

五、使用注意事项

  1. explain 的 rows 是 mysql 预估的扫描行数,不是实际行数,但能反映性能趋势(数值越小越好)。
  2. explain 只分析执行计划,不会实际执行 sql(除非用 explain analyze),所以可以放心在生产环境使用。
  3. 即使 possible_keys 有值,key 也可能为 null —— 说明 mysql 认为走索引不如全表扫描快(比如表数据量极小)。

总结

  1. explain 是分析 sql 执行计划的核心工具,重点看 type(访问类型)、key(实际索引)、extra(额外提示)三个字段。
  2. 优化目标:尽量让 type 达到 range 及以上,key 不为 null,避免 extra 出现 using filesort/using temporary。
  3. 最理想的执行计划:type 为 const/system + key 有值 + extra 显示 using index。

到此这篇关于mysql中explain的具体实现的文章就介绍到这了,更多相关mysql explain内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

MySQL中的数据库约束用法及说明

03-17

MySQL 存储引擎InnoDB 架构与原理深度解析

03-17

MySQL5.7配置Pseudo-GTID完整步骤

03-17

MySQL 数据类型核心指南之选型、实战与避坑

03-17

MySQL实现可重入锁的实践指南

03-17

MYSQL连接不上本地服务器localhost的问题及解决

03-17

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论