explain详解与最佳实践

本文介绍了MySQL中的EXPLAIN关键字,用于获取查询执行计划,帮助理解查询优化,涵盖了select_type、table、type等列的含义,以及索引选择和使用策略,提供实例以指导数据库性能调优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

explain使用与详解

简介

explain是MySQL中的一个关键字,用于获取select语句的执行计划。当你对一个select语句使用explain关键字时,MySQL会返回关于如何执行该查询的详细信息,而不是实际执行查询并返回结果。这对于优化查询性能非常有用,因为它可以帮助你理解MySQL如何处理你的查询,并法吸可能存在的性能瓶颈。

tips:本文只会介绍常用的类型,至于其他具体用法可到MySQL官网explain介绍查看

mysql5.7默认会对派生表进行合并优化,通过derived_merge来控制,默认为on,表示开启。

开启:set session optimizer_switch='derived_merge=on';
关闭:set session optimizer_switch='derived_merge=off';

如何使用

部门表:
CREATE TABLE `t_department` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_department` VALUES ('1', '部门1');
INSERT INTO `t_department` VALUES ('2', '部门2');
INSERT INTO `t_department` VALUES ('3', '部门3');

用户表:
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `t_user` VALUES ('1', '张三', '2024-03-16 20:57:12');
INSERT INTO `t_user` VALUES ('2', '李四', '2024-03-16 20:57:24');
INSERT INTO `t_user` VALUES ('3', '王五', '2024-03-16 20:57:30');

用户部门关联表:
CREATE TABLE `t_user_dept` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `dept_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_user_dept_id` (`user_id`,`dept_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `t_user_dept` VALUES ('1', '1', '1');
INSERT INTO `t_user_dept` VALUES ('2', '2', '2');
INSERT INTO `t_user_dept` VALUES ('3', '3', '3');

在select语句前加入explain关键字即可:

explain select * from t_user where id=1

explain列信息

id

id列就是select的序列号,有几个查询就有几个id,id的顺序是按select出现的顺序增长的。越大执行优先级越高,id相关则从上往下执行,id为null最后执行

select_type

select_type表示查询的类型,由简单到复杂

SIMPLE:简单查询,查询不包含子查询和union。这是最常见的类型

PRIMARY:查询包含任务复杂的子部分(如子查询或union)时,最外层的查询被标记PRIMARY

UBQUERY:当select或where列表中包含子查询时,子查询的select可能是SUBQUERY。与PRIMARY例子相同

DERIVED:在 from列表中包含的子查询被标记为 DERIVED(衍生)。MySQL 会递归执行这些子查询,并把结果放在临时表里

UNION:union操作中,内层的select(即

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiridancan

你的鼓励师我创造最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值