MySQL--explain执行计划详解

什么是执行计划?

SQL的执行计划,通俗来说就是SQL的执行情况,一条SQL语句扫描哪些表,那个子查询先执行,是否用到了索引等等,只有当我们知道了这些情况之后才知道,才可以更好的去优化SQL,而这个过程MySQL帮助我们生成好了,这就是执行计划。

执行计划的作用?

  • 可以看到表的读取顺序。
  • 可以直观看到索引的使用情况。
  • 可以看到每张表中的数据查询情况,有多少条数据被扫描获取。
  • 可以看到查询表数据的类型。

一句话概括,可以帮我们写出优雅、高性能的SQL。

准备数据:

#创建user表
CREATE TABLE `user` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户姓名',
  `user_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户工号',
  `age` tinyint DEFAULT NULL COMMENT '用户年龄',
  `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户地址',
  `hobby` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户爱好',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `index_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';

#准备数据
INSERT INTO `user`(id, user_name, user_code, age, address, hobby)VALUES(1, '张三', 'TC-00000001', 25, '湖北', '篮球');
INSERT INTO `user`(id, user_name, user_code, age, address, hobby)VALUES(2, '李四', 'TC-00000001', 26, '湖南', '足球');
INSERT INTO `user`(id, user_name, user_code, age, address, hobby)VALUES(3, '王五', 'TC-00000001', 23, '广东', '电影');

#创建索引
create index  index_name on user(user_name);

查看user表中的所有索引:

show index from user;

结果:
在这里插入图片描述

查看执行计划的语法:

  • explain + SQL查询语句。
  • desc + SQL查询语句,估计有部分同学不知道desc 这个关键字还可以查看执行计划。

使用explain 查看SQL执行计划:

# 
explain select * from user where user_name='张三';;

执行计划:
在这里插入图片描述

使用desc 查看SQL执行计划:

# 
desc select * from user where user_name='张三';;

执行计划:
在这里插入图片描述
根据对比可以看出explain、desc 都可以看SQL的执行计划。

执行计划各个指标的说明:

  • id:SQL的执行顺序,id越大优先级越高,越先被执行。
  • select_type:每个select子句的类型。
    SIMPLE,简单的查询,不包含子查询或者union查询。
    PRIMARY,最外层查询,查询中包含任何复杂的子查询,则最外层查询被标记为PRIMARY。
    DERIVED,衍生的,在from列表中包含子查询,其类型会别标记为DERIVED。
  • table:表名。
  • type:访问类型,需要重点关注,直接体现了SQL语句的性能,常见的类型 system->const->eq_ref->ref->range->index->all,性能依次从好到差。
    const、system:主键索引或唯一索引的所有列与常量比较时,表里最多有一个匹配行,读取一次。
    eq_ref:命中主键索引或者唯一索引,查询结果最多返回一条数据。
    ref:使用普通索引或者唯一索引的部分前缀,索引和某个值对比的时候,会查询到多行结果。
    range:只检索给定范围的行。
    index:只遍历索引树。
    all:全表扫描,MySQL会遍历全表找到匹配的数据行,性能最差。
  • piossible_keys:可能用到的索引。
  • key:实际查询用到的索引。
  • key_len:索引中使用的字节数,可以通过该列计算查询中使用的索引的长度。
  • rows:表示MySQL根据表情况及索引使用情况,估算找到目标数据需要扫描的行数,这个值越小越好。
  • filtered:表示经过条件过滤后剩余记录所占百分比,这个数据越大越好。
  • Extra:Extra有以下几个常用的值。
    Using index,查询的列被索引覆盖(覆盖索引),并且where筛选条件是索引的前导列,是查询性能高的表现。
    Using where,查询的列没有被索引覆盖,where筛选条件不是索引的前导列。
    Using where Using index,查询的列没有被索引覆盖,但是where筛选条件是所有列之一但不是索引前导列。
    NULL,查询的列没有被索引覆盖,但是where查询条件使用了索引前导列。
    Using index condition,查询条件虽然用到了索引列,但是有部分条件无法使用索引列,先会使用索引列的条件搜索一遍,在使用其他条件搜索。
    Using temporay,MySQL需要建立一张临时表来处理数据,常出现在分组或排序查询中,这种情况是需要优化的。
    Using filesort,文件排序,MySQL会对查询结果进行外部排序,而无法使用索引排序,这种情况也是要优化的。

key_len说明:
key_len:表示索引使用的字节数,通过这个值可以算出索引使用了哪些列,不同类型的数据在MySQL中占用的字节数如下,供参考。
字符串类型:

  • char(n):n字节。
  • varchar(n):如果使用utf-8编码,占用字节数为3n+2,2是用存储字符串长度。
  • varchar(n):如果使用utf8mb4编码,占用字节数为4n+2,2是用存储字符串长度。

数值类型:

  • tinyint:1字节。
  • smallint:2字节。
  • int:4字节。
  • bigint:8字节。

时间类型:

  • date:3字节。
  • timestamp:4字节。
  • datetime:8字节。

如果字段允许为空,则额外需要一个字节去记录是否为空。

如有不正确的地方请各位指出纠正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

族群争霸休闲养成小游戏

​游戏概述: 在一个由自然力量支配的幻想世界中,狼族与羊族的战争永无止境。 人族在两者之间寻求和平,建立起坚固的城墙,同时捕捉狼与羊来增强自身实力。 神族则在幕后观察,偶尔以神技介入战场,影响战局…

harmonyos arkts 开发商品页面

1.结果展示 2. 实现分层组件 1.1 实现搜索栏 1.2 代码 这段代码是一个构建搜索框组件的方法,具体功能包括: - 创建一个Search组件,设置初始值为this.keyword,placeholder为请输入书名... - 添加一个搜索按钮,并设置…

k8s应用综合实例

k8s应用综合实例 目录 k8s应用综合实例 目录 原文链接 推荐文章 实验环境 实验软件 本节实战 预期 原理 高可用 稳定性 避免单点故障 使用 PDB 健康检查 服务质量 QoS QoS类型 资源回收策略 滚动更新 失败原因 零宕机 HPA 安全性 持久化 Ingress FAQ …

【项目笔记】java微服务:黑马头条(day01)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)课程对比2)项目概述2.1)能让你收获什么2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备4.2)nacos安装 5)初始工程搭建5.1)环境准备5.2)主体结构 6)登录6.1…

scipy一维卷积函数convolve1d

文章目录 基本原理convolve1d函数实战 基本原理 卷积是一种积分变换方法,可理解为滑动平均的推广,在连续函数和数列上的定义分别为 f ( t ) ∗ g ( t ) ∫ f ( τ ) g ( t − τ ) d τ x ( n ) ∗ h ( n ) ∑ x ( i ) h ( n − i ) f(t)*g(t) \int …

第二课 情感认知模型

一、学习目标 1.学习各种思想的情感模型 2.了解通过情感诱发方法所建立的情感模型 二、情感模型 想要进行情感计算,首先步骤就是对情感建模,要分析理解情感的产生,从而才能让计算机理解情感。由于情感是感性的,所以现有的情感模…

贪心算法(蓝桥杯 C++ 题目 代表 注解)

介绍: 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望最终能够得到全局最好或最优的结果的算法。它通常用来解决一些最优化问题,如最小生…

实时智能应答3D数字人搭建

语音驱动口型的算法 先看效果: 你很快就可以帮得上我了 FACEGOOD 决定将语音驱动口型的算法技术正式开源,这是 AI 虚拟数字人的核心算法,技术开源后将大程度降低 AI 数字人的开发门槛。FACEGOOD是一家国际领先的3D基础软件开发商,…

恢复IDEA误删除的git提交,提交被删除,尝试恢复提交

​​​​​​ dgqDESKTOP-JRQ5NMD MINGW64 /f/IdeaProjects/workspace/spzx-parent ((8bb112e...)) $ git reflog 8bb112e (HEAD, origin/master, master) HEAD{0}: checkout: moving from master to 8bb112e5ac18dfe4bbd64adfd06363e46b609f21 8bb112e (HEAD, origin/master, …

第十三章StringTable

第十三章StringTable 文章目录 第十三章StringTable1. String的基本特性2. String的内存分配3. 字符串的拼接操作体会执行效率: 4. intern()的使用问题1new String("ab")会创建几个对象?看字节码…

PID的含义及查看方法(macOS系统和Windows系统)

一 PID的含义 PID是processs indentifier的缩写, 中文是进程标识符。我们每启动一个软件,系统都会生成一个进程,同时生成一个对应的PID(一串数字,一般从0开始),在软件运行期间,PID是…

Day34-Linux网络管理4

Day34-Linux网络管理4 1. IP地址分类与子网划分基础1.1 什么是IP地址1.2 十进制与二进制的转换1.3 IP地址的分类1.4 私网地址和局域网地址 2. 通信类型3. 子网划分讲解3.1 为什么要划分子网?3.2 什么是子网划分?3.3 子网划分的作用?3.4 子网划…

表单进阶(3)-上传文件和隐藏字段

上传文件&#xff1a;<input type"file"> 隐藏字段&#xff1a;<input type"hidden" name"" id"" value"带给后端的信息"> 禁用disabled&#xff1a;<button disabled"disabled">注册</bu…

简历--毕业论文

文章目录 MPLS VPN网络的设计与实施一、研究背景和意义二、研究内容2.1网络设计2.1.1 MPLS VPN配置思路2.1.2基本配置2.1.3 实验结果 三、结论其他 MPLS VPN网络的设计与实施 摘 要&#xff1a;本文选择研究对象是cisco的MPLS VPN网络&#xff0c;具有经济适用&#xff0c;扩展…

08 线性卷积

各位看官&#xff0c;大家好&#xff01;本讲为《数字信号处理理论篇》08 线性卷积。&#xff08;特别提示&#xff1a;课程内容为由浅入深的特性&#xff0c;而且前后对照&#xff0c;不要跳跃观看&#xff0c;请按照文章或视频顺序进行观看。 最近阳春三月&#xff0c;万物复…

HarmonyOS系统开发基础环境搭建

一 鸿蒙介绍&#xff1a; 1.1 HarmonyOS系统是华为自研的一款分布式操作系统&#xff0c;兼容Android&#xff0c;但又区别Android&#xff0c;不仅仅定位于手机系统。更侧重于万物物联和智能终端&#xff0c;目前已更新到4.0版本。 1.2 HarmonyOS软件编程语言是ArkTS&#x…

MySQL--索引优化实战篇(1)

前言&#xff1a; 我们常说的SQL优化&#xff0c;简单来说就是索引优化&#xff0c;通过合理创建索引&#xff0c;调整SQL语法等&#xff0c;来提升查询效率&#xff0c;想要进行SQL优化&#xff0c;就必须知道索引的原理&#xff0c;而且能够看懂SQL的执行计划。 MySQL–索引…

瑞芯微第二代8nm高性能AIOT平台 RK3576 详细介绍

RK3576处理器 RK3576瑞芯微第二代8nm高性能AIOT平台&#xff0c;它集成了独立的6TOPS&#xff08;Tera Operations Per Second&#xff0c;每秒万亿次操作&#xff09;NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;用于处理人工智能相关的任务。此外&#xff0c;R…

ARM-v7 程序计数器PC的相关指令与应用

1. 前言 如图1所示&#xff0c;R14是连接寄存器&#xff08;Link Register&#xff09;&#xff0c;在汇编指令中通常也写为LR&#xff0c;用于存储函数调用和异常等的返回信息&#xff0c;复位时&#xff0c;默认值为0xFFFFFFFF&#xff1b; 图1 Core register R15是程序计数…

华为OD机考-C卷

文章目录 攀登者问题停车场最短路径 攀登者问题 24/03/09 20:50~23:10 攀登者喜欢寻找各种地图&#xff0c;并且尝试攀登到最高的山峰。地图表示为一维数组&#xff0c;数组的索引代表水平位置&#xff0c;数组的元素代表相对海拔高度。其中数组元素0代表地面。一个山脉可能有多…