深入了解 MySQL 的 EXPLAIN 命令

news2024/9/24 21:20:36

一、什么是 EXPLAIN 命令?

EXPLAIN 命令用于显示 MySQL 如何执行某个 SQL 语句,尤其是 SELECT 语句。通过 EXPLAIN 命令,可以看到查询在实际执行前的执行计划,这对于优化查询性能至关重要。

二、EXPLAIN 的基本用法

要使用 EXPLAIN 命令,只需在你的 SELECT 语句前加上 EXPLAIN 关键字即可。例如:

EXPLAIN SELECT * FROM employees WHERE department = 'Sales';

执行上述命令后,MySQL 会返回一个结果集,包含关于查询执行计划的详细信息。下面我们逐一解释这些信息。

三、EXPLAIN 结果各列的含义

EXPLAIN 命令的结果集通常包含以下几列:

  • id
  • select_type
  • table
  • partitions
  • type
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • filtered
  • Extra

id

id 列表示查询中每个 SELECT 子句的标识符。单个查询的 id 值通常是 1,子查询和联合查询的 id 值可能不同。

select_type

select_type 列表示 SELECT 的类型,常见的值有:

  • SIMPLE:简单的 SELECT 查询,不包含子查询或联合查询。
  • PRIMARY:最外层的 SELECT 查询。
  • UNION:UNION 中的第二个或后续的 SELECT 查询。
  • DEPENDENT UNION:UNION 中的第二个或后续的 SELECT 查询,依赖于外部查询。
  • UNION RESULT:UNION 的结果。
  • SUBQUERY:子查询中的第一个 SELECT。
  • DEPENDENT SUBQUERY:子查询中的第一个 SELECT,依赖于外部查询。
  • DERIVED:派生表(子查询的 FROM 子句)。

table

table 列表示正在访问的表的名称。

partitions

partitions 列表示查询涉及到的分区。如果表是分区表,此列将显示实际访问的分区。如果没有使用分区,该列显示 NULL

type(重点)

type 列表示连接类型(join type),反映了 MySQL 在执行查询时使用的访问方法。连接类型从最优到最差依次如下:

  • system:表仅有一行(等于系统表),这是 const 类型的特例。
  • const:表最多有一个匹配行,这是非常快速的,因为匹配行在优化阶段就读取出来了。使用索引一般是一般是 唯一索引 或 主键索引。
  • eq_ref:对于每个来自前一张表的行组合,读一行,这是最理想的连接类型。连接字段,使用索引一般是 唯一索引 或 主键索引。
  • ref:对于每个来自前一张表的行组合,读出所有匹配某个单独值的行。使用索引一般是普通索引。
  • range:检索给定范围内的行,使用一个索引来选择行。
  • index:全索引扫描(与全表扫描类似,但遍历索引树)。
  • ALL:全表扫描。

possible_keys

possible_keys 列表示查询可能使用的索引。

key(重点)

key 列表示实际使用的索引。如果没有选择索引,显示 NULL

key_len

key_len 列表示使用的索引键的长度。这个值是 MySQL 决定使用哪个索引时考虑的。

ref

ref 列表示使用哪个列或常量与 key 一起从表中选择行。

rows

rows 列表示 MySQL 估计为了找到所需的行,需要读取的行数。

filtered

filtered 列表示经过表条件过滤后返回的行数百分比。这个值表示剩余行数相对于读取的行数的百分比。计算公式为:filtered = (满足表条件的记录数 / 该表的总记录数) * 100%。

注意如果使用索引查询,那么 MySQL 可能不会扫全表,直接查出索引中返回的数据,filtered 会是 100。

Extra

Extra 列包含关于查询的详细信息,可能的值有:

  • Using index:只使用索引信息而不读取实际的行(覆盖索引)。
  • Using where:使用 WHERE 子句来限制哪些行将与下一张表匹配或返回给用户。
  • Using temporary:需要使用临时表来存储结果。
  • Using filesort:需要额外的传递来排序结果。

四、EXPLAIN 命令 type 字段 SQL 测试

4.1、const 类型测试

-- const 类型测试
drop table if exists user;
create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

explain
select *
from user
where id = 1;

image-20240713155353388

4.2、eq_ref 类型测试

-- eq_ref 类型测试
drop table if exists user_balance;
drop table if exists user;

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

create table user_balance (
  uid int primary key,
  balance int
)engine=innodb;

insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);

explain
select *
from user
         left join user_balance on user.id = user_balance.uid
where user.id = user_balance.uid;

image-20240713155429390

4.3、ref 类型测试

-- ref 类型测试
drop table if exists user_balance;
drop table if exists user;

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

create table user_balance (
  uid int,
  balance int,
  index(uid)
)engine=innodb;

insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);
insert into user_balance values(5,500);

explain
select *
from user
         left join user_balance on user.id = user_balance.uid
where user.id = 1;

explain select * from user_balance where uid = 1;

image-20240713155508580

4.4、range 类型测试

-- range 类型测试
drop table if exists user;

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

explain
select *
from user
where id between 1 and 2;

explain
select *
from user
where id in (1, 2, 3);

explain
select *
from user
where id > 1;

image-20240713155627248

4.5、index 类型测试

-- index 类型测试
drop table if exists user;

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');

explain
select count(1)
from user;

image-20240713155701062

4.6、ALL 类型测试

-- ALL 类型测试
drop table if exists user;

create table user (
  id int,
  name varchar(20)
)engine=innodb;

insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');

explain
select *
from user
where id = 1;

image-20240713155750163

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1924297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法篇】KMP算法,一种高效的字符串匹配算法

我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!! KMP算法的基本概念 KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的&#…

Cxx Primer-CP-2

开篇第一句话足见作者的高屋建瓴:类型决定程序中数据和操作的意义。随后列举了简单语句i i j;的意义取决于i和j的类型。若它们都是整形,则为通常的算术意义。若它们都为字符串型,则为进行拼接操作。若为用户自定义的class类型,则…

《Linux系统编程篇》Visual Studio Code配置下载,中文配置,连接远程ssh ——基础篇

引言 vscode绝对值得推荐,非常好用,如果你能体会其中的奥妙的话。 工欲善其事,必先利其器 ——孔子 文章目录 引言下载VS Code配置VS Code中文扩展连接服务器 连接服务器测试确定服务器的IP地址VS code 配置ssh信息选择连接到主机选择这个添…

K8s学习笔记1-搭建k8s集群

本次使用kubeadm方式,部署1.23.17版本 安装包百度云盘地址: 链接:https://pan.baidu.com/s/1UrIotP253DoyDIYB7G1C0Q 提取码:8q6a 集群所需虚拟机环境 主机名称IP资源harbor10.0.0.2301c2gmaster10.0.0.2312c4gworker110.0.0…

全新UI自助图文打印系统源码(含前端小程序源码 PHP后端 数据库)

最新自助图文打印系统和证件照云打印小程序源码PHP后端,为用户用户自助打印的服务,包括但不限于文档、图片、表格等多种格式的文件。此外,它们还提供了诸如美颜、换装、文档打印等功能,以及后台管理系统,方便管理员对打…

7.13 专题训练DP

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ac代码 #include<bits/stdc.h> using namespace std; typedef long long ll; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) const ll mod 1e97;int main() {IOS;int n;cin>>n;int a[…

面向对象与C++进阶—并发与多线程篇

文章目录 18. 并发与多线程篇说在前面(1).线程和进程(2).并发和并行(3).thread(C11)#1.thread库与thread类#2.join和detach方法#3.id类和get_id方法#4.this_thread和系列操作 (4).原子操作#1.为什么是原子?#2.为什么需要原子操作&#xff1f;#3.atomic库 (5).竞态条件(6).线程…

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)

7-1、2、3 IPFS介绍使用及浏览器交互&#xff08;react区块链实战&#xff09; 7-1 ipfs介绍7-2 IPFS-desktop使用7-3 reactipfs-api浏览器和ipfs交互 7-1 ipfs介绍 IPFS区块链上的文件系统 https://ipfs.io/ 这个网站本身是需要科学上网的 Ipfs是点对点的分布式系统 无限…

TEB局部路径规划算法代码及原理解读

TEB(Timed Elastic Band) 是一个基于图优化的局部路径规划算法&#xff0c;具有较好的动态避障能力&#xff0c;在ROS1/ROS2的导航框架中均被采用。该图优化以g2o优化框架实现&#xff0c;以机器人在各个离散时刻的位姿和离散时刻之间的时间间隔为顶点&#xff0c;约束其中的加…

IEEE(常用)参考文献引用格式详解 | LaTeX参考文献规范(IEEE Trans、Conf、Arxiv)

IEEE参考文献引用格式注意事项 期刊已正式出版&#xff08;有期卷号&#xff09;录用后在线访问即Early access&#xff08;无期卷号&#xff09; Arxiv论文会议论文IEEE缩写进阶其他 IEEE论文投稿前的参考文献格式检查&#xff01;&#xff08;如果一些细节你采用别的形式&…

UE4 解决创建布料报错:三角形退化

**【问题】**创建创建布料时报错&#xff1a;三角形退化 【方法】 1.要重新绑定&#xff1a;导入到ue4为静态网格体&#xff0c;勾选“移除退化”&#xff0c;再导出fbx&#xff0c;再重新绑定 2.不用重新绑定&#xff1a;使用排除法&#xff08;费时&#xff09;&#xff0c…

开放式耳机选哪个牌子好?五大主流王炸爆款推荐!

在快节奏的现代生活中&#xff0c;音乐是不可或缺的慰藉。作为音乐迷&#xff0c;我追求音质卓越与佩戴舒适的耳机。开放式蓝牙耳机&#xff0c;以革新设计和技术&#xff0c;颠覆传统认知&#xff0c;既呈现高品质音乐盛宴&#xff0c;又确保长久佩戴的极致舒适&#xff0c;成…

记一次,由于发布配置引发的alpine中运行sqlite3的错误解决历程思路!

使用net的都知道&#xff0c;打包镜像的时候的基础包有2个选择(实际上更多) 比如我们使用aspnet6.0作为基础包&#xff0c;则有2个选择 mcr.microsoft.com/dotnet/aspnet:6.0 212MB (basic) mcr.microsoft.com/dotnet/aspnet:6.0-alpine 104MB (alpine) 问题回顾 目前的Past…

小红书种草怎么做?

文末领取小红书电商开店运营教程&#xff01; 在如今的社交电商时代&#xff0c;小红书作为国内最大的生活分享社区&#xff0c;已成为了许多人找寻新品、新店、新玩法的必选平台。 小红书上的“种草”文化也日渐盛行&#xff0c;它不仅仅是一个购物指南&#xff0c;更是一种…

Python3极简教程(一小时学完)下

目录 PEP8 代码风格指南 知识点 介绍 愚蠢的一致性就像没脑子的妖怪 代码排版 缩进 制表符还是空格 每行最大长度 空行 源文件编码 导入包 字符串引号 表达式和语句中的空格 不能忍受的情况 其他建议 注释 块注释 行内注释 文档字符串 版本注记 命名约定 …

索引结构与检索原理

一、mysql索引结构 1.BTree索引 [检索原理] 左边列的表格&#xff08;真实数据&#xff09;&#xff0c;右边对应一棵树&#xff0c;树的管度越来越管查询越快。 以下图表的名称为&#xff1a;段区块 硬盘都是长方形的&#xff0c;打了一个封装&#xff0c;里面是一个圆圈…

游戏热更新——AssetBundle

AssetBundle AssetBundle的定义与使用 AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至是整个场景&#xff0c;可以在游戏运行的时候被加载 AssetBundle自身保存着相互的依赖关系 压缩包可以使用LZMA和LZ4压缩算法&#xff0c;减少包大小&#xff0c;更快的进行网…

栈(Stack)and leetcode刷题

栈&#xff08;Stack&#xff09;and leetcode刷题 1. 栈&#xff08;Stack&#xff09;的概念2. 栈&#xff08;Stack&#xff09;的实现2.1 用数组实现2.2 用链表实现2.2.1 用单链表实现 3. leetcode刷题3.1 括号匹配问题3.2 栈的弹出压入序列3.3 逆波兰表达式求值中缀表达式…

Cartographer重入门到精通(二):运行作者demo及自己的数据集

在demo数据包上运行cartographer 现在Cartographer和Cartographer的Ros包已经都安装好了&#xff0c;你可以下载官方的数据集到指定的目录&#xff08;比如在Deutsches Museum用背包采集的2D和3D 数据&#xff09;&#xff0c;然后使用roslauch来启动demo。 注&#xff1a;la…

一文了解5G新通话技术演进与业务模型

5G新通话简介 5G新通话&#xff0c;也被称为VoNR&#xff0c;是基于R16及后续协议产生的一种增强型语音通话业务。 它在IMS网络里新增数据通道&#xff08;Data Channel&#xff09;&#xff0c;承载通话时的文本、图片、涂鸦、菜单等信息。它能在传统话音业务基础上提供更多服…