mysql执行计划explain

news2025/1/23 6:58:18

mysql 执行计划

explain 介绍

  • mysql8.0为例:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

EXPLAIN为语句中使用的每个表返回一行信息 SELECT。它按照 MySQL 在处理语句时读取它们的顺序列出输出中的表。这意味着 MySQL 从第一个表中读取一行,然后在第二个表中找到匹配的行,然后在第三个表中,依此类推。当所有的表都被处理完后,MySQL 将选择的列输出,并在表列表中回溯,直到找到一个有更多匹配行的表。从此表中读取下一行,然后继续处理下一个表

创建两个表(student、scope)

  • 创建表
create table student
(
    student_id bigint auto_increment comment '学生id'
        primary key,
    name       varchar(20) null comment '学生姓名',
    age        int         null comment '年龄'
)
    comment '学生表';


create table score
(
    score_id   bigint auto_increment comment '分数id'
        primary key,
    student_id bigint        not null comment '学生id',
    subject    varchar(20)   null comment '科目',
    score      decimal(5, 2) null comment '分数'
)
    comment '学生成绩表';
  • 添加索引
create index idx_student_id
    on score (student_id);
create index idx_subject
    on score (subject);
  • 初始化数据
insert into md_test.student (student_id, name, age)
values  (1, '小明', 18),
        (2, '张三', 19),
        (3, '李四', 19),
        (4, '王二', 17),
        (5, '孙悟空', 17),
        (6, '猪八戒', 20);

insert into md_test.score (score_id, student_id, subject, score)
values  (1, 1, '语文', 90.00),
        (2, 1, '数学', 98.00),
        (3, 2, '语文', 97.00),
        (4, 2, '数学', 87.00),
        (5, 3, '语文', 78.00),
        (6, 3, '数学', 88.00),
        (7, 4, '语文', 99.00),
        (8, 4, '数学', 100.00),
        (9, 5, '语文', 96.00),
        (10, 5, '数学', 78.00),
        (11, 6, '语文', 87.00),
        (12, 6, '数学', 88.00);

explain 输出列

  • 使用explain查询sql执行计划
explain
select * from student;
  • 对应执行计划
    在这里插入图片描述
id
  • 标识符SELECT。SELECT这是查询中的序号 。NULL如果该行引用其他行的并集结果,则该值可以是。在这种情况下,该 table列显示一个值 like 表示该行引用具有值 和 的行的并集
select_type
  • simple
    简单查询不包含子查询和union,如果查询中有任何复杂的子部分,则最外层部分标记为PRIMARY
explain
select * from student limit 1;

在这里插入图片描述

  • PRIMARY
    最外层的select
explain
select (select st.name from student st where st.student_id = sc.student_id) as student_name, sc.score
from score sc;

在这里插入图片描述

  • SUBQUERY SELECT子查询中的第一个
  • DEPENDENT SUBQUERY 首先SELECT在子查询中,依赖于外部查询
explain
select (select st.name from student st where st.student_id = sc.student_id) as student_name, sc.score
from score sc;

在这里插入图片描述

  • UNION SELECT中的 第二个或后面的语句UNION
  • UNION RESULT 表示用来从UNION的匿名临时表检索结果的select
explain
select * from student s1 where s1.student_id=1
union
select * from student s2 where s2.student_id=4;

在这里插入图片描述

  • derived 派生表(临时表)
table
  • 输出行所引用的表的名称。这也可以是以下值之一
    <unionM,N>: 当有 union 时,UNION RESULT 的 table 列的值为 <unionM,N>。 MN
    :该行引用值为 的行的派生表id结果 N。例如,派生表可能来自子句中的子查询 FROM。
    id :该行引用值为 的行的具体化子查询的结果N
partitions
type
  • 查询将匹配记录的分区
  • 查询效率依次从最优到最差分别为
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • const 该表最多有一个匹配行,在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。 const表非常快,因为它们只读一次。
  • system 该表只有一行(=系统表)。这是连接类型的一个特例 const。
explain
select *
from student s1
where s1.student_id = 1;

在这里插入图片描述

  • eq_ref
    primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录
    除了 systemand const类型,这是最好的连接类型
explain
select (select st.name from student st where st.student_id = sc.student_id) as student_name, sc.score
from (select * from score s where s.score > 80) sc;

在这里插入图片描述

  • ref
    相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行
explain
select * from score sc where sc.student_id=3;

在这里插入图片描述

  • ref_or_null
    这种连接类型类似于 ref,但 MySQL 对包含值的行进行了额外的搜索NULL。这种连接类型优化最常用于解析子查询

  • index_merge
    此连接类型表示使用索引合并优化

  • range
    仅检索给定范围内的行,使用索引来选择行。key 输出行中的列指示使用了哪个索引。包含key_len使用过的最长的密钥部分。该ref列 NULL适用于此类型。

range=可以在使用, <>, >, >=, , <, <=, IS NULL, <=>, BETWEEN, LIKE或 运算符将键列与常量进行比较时使用 IN()

explain
select *
from student
where student_id>2 and student_id<6;

在这里插入图片描述

  • index
    连接index类型与 相同 ALL,只是扫描了索引树
possible_keys
  1. 这一列显示查询可能使用哪些索引来查找
  2. 如果此列是NULL,则没有相关索引
  3. 要查看表有哪些索引,请使用. show index from table_name
    在这里插入图片描述
key
  1. 该key列表示 MySQL 实际决定使用的键(索引)
  2. 如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index
key_len

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列

ref

该ref列显示将哪些列或常量与列中指定的索引进行比较 key以从表中选择行

rows

该rows列表示查询扫描的行数
对于InnoDB表格,此数字是一个估计值,可能并不总是准确的

Extra

查询的附加信息

  • distinct
    一旦mysql找到了与行相联合匹配的行,就不再搜索了

  • Using index
    select语句中使用覆盖索引,以避免回表查询(当查询仅使用属于单个索引的列时,可以使用此策略)

explain
select student_id
from student
where student_id=2;

在这里插入图片描述

  • Using where
    使用了where过滤
explain
select *
from student
where student_id>2;

在这里插入图片描述

  • Using filesort
  • Using index condition

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

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

相关文章

四维轻云平台常见问题及解决方法

1、在地图中看不见加载的点云或倾斜摄影模型数据&#xff1f; 若点云或模型数据加载后&#xff0c;在地图中看不见&#xff0c;可能是地形的高度高于倾斜模型的高度&#xff0c;导致数据漂浮在空中或者在地形以下&#xff0c;可通过增加数据的移动值Y来调整点云或者模型数据的…

《Java并发编程实战》课程笔记(一)

并发领域的全景图 并发编程的三个核心问题 并发编程可以总结为三个核心问题&#xff1a;分工、同步、互斥。 分工指的是如何高效地拆解任务并分配给线程&#xff1b; Java SDK 并发包里的 Executor、Fork/Join、Future 本质上都是⼀种分工方法。除此之外&#xff0c;并发编程…

吉时利 Keithley 2700数据采集器技术参数

概述&#xff1a; 每个 2700 系列系统均将精密测量、开关和控件集于一个紧凑集成的机箱中&#xff0c;适用于机架安装或台式应用。虽然所有三个系统的核心功能和编程是相同的&#xff0c;但各个主机都具有独特的功能。例如&#xff0c;2701 型具有 10/100BaseTX 以太网接口&am…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月24日论文合集)

文章目录 一、检测相关(7篇)1.1 Learning Remote Sensing Object Detection with Single Point Supervision1.2 Online Open-set Semi-supervised Object Detection via Semi-supervised Outlier Filtering1.3 Generalizable Synthetic Image Detection via Language-guided Co…

代码随想录训练营Day51| 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结

目录 目录 学习目标 学习内容 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 学习目标 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结 学习内容 309.最佳买卖股票时机含冷冻期 309. 最佳买卖股票时机含冷冻期 - 力扣&#xff0…

大模型知识Out该怎么办?浙大团队探索大模型参数更新的方法—模型编辑

夕小瑶科技说 原创 作者 | 小戏、Python 大模型在其巨大体量背后蕴藏着一个直观的问题&#xff1a;“大模型应该怎么更新&#xff1f;” 在大模型极其巨大的计算开销下&#xff0c;大模型知识的更新并不是一件简单的“学习任务”&#xff0c;理想情况下&#xff0c;随着世界…

网络协议 — IPSec 安全隧道协议族

目录 文章目录 目录IPSec 安全隧道协议族封装协议Authentication HeaderEncapsulating Security Payload 封装模式传输模式隧道模式 安全偶联协商Security AssociationInternet Key ExchangeIKE 的交换过程 IPSec Virtual Private NetworkIPSec NAT-TTransport 模式Tunnel 模式…

mjpg-streamer框架分析

mjpg-streamer框架分析 文章目录 mjpg-streamer框架分析框架maininput_initinput_runoutput_init 框架 main 这个函数是一个C程序的主函数&#xff0c;接受命令行参数并执行相应的操作。下面是这个函数的要点&#xff1a; 定义了一些变量&#xff0c;包括输入插件数组input、输…

知识点滴 - dBm和mW的转换

分贝毫瓦dBm&#xff0c;decibel-milliwatts&#xff0c;全写为“decibel relative to one milliwatt”&#xff0c;为一个指代功率的绝对值&#xff0c;而不同于dB只是一个相对值。 dBm或dBmW&#xff08;分贝-毫瓦&#xff09;用于表示功率的水平或级别&#xff0c;以分贝&am…

Android | 关于 OOM 的那些事

前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量的对象无法被释放)导致…

精准数据分析,TeeChart为企业量身定制可视化退休预估方案

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 点击立即下载最新版Tee…

docker下不同容器的网络互相访问问题

目录 背景 ​编辑 docker网络模式 解决方法 mysql下 docker-compose下网络设置 nacos 效果 背景 我这边有两个容器&#xff0c;宿主机ip为 192.168.1.115&#xff0c;一个mysql&#xff0c;一个nacos&#xff0c;部署在主机上&#xff0c;使用的默认网络bridge&#xff…

学习SpringBoot入门知识,附带教程源码分享,快速掌握开发技巧-【imooc-java2021】体系课-Java工程师 2022版

学习SpringBoot入门知识&#xff0c;附带教程源码分享&#xff0c;快速掌握开发技巧 目录福利&#xff1a;文末有分享SpringBoot教程及源码哦 一、Spring Boot 是什么二、为什么要使用 Spring Boot三、快速入门3.1 创建 Spring Boot 项目3.1.1 通过 Spring Initializr 来创建1、…

微信小程序入门开发懂你找图小程序

文章目录 搭建 tabbar页面路径 首页模块tabs组件需求推荐组件精选大图月份热门分类模块需求 分类详情业务 首页模块专辑模块需求 专辑详情精美视频需求 视频详情需求 图片详情需求 搭建 tabbar 页面路径 页面名称路径首页index横屏horizontal精美视频video搜索search我的mine …

MySQL——存储引擎于索引应用

文章目录 一、 存储引擎1.1 MySQL结构1.2 存储引擎简介1.3 存储引擎特点1.3.1 InnoDB1.3.1.1 InnoDB 基本介绍1.3.1.2 InnoDB 逻辑存储结构 1.3.2 MyISAM1.3.3 Memory 1.4 三种引擎特点及区别1.5 存储引擎选择 二、 索引 - 重点2.1 介绍2.2 索引结构2.2.1 B-Tree 多路平衡二叉树…

【Linux:动态库与静态库】

1 动态库与静态库的概念 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使…

企业微信4.1.6 版本新功能介绍

一、效率工具与基础体验优化 文档 文档增加了丰富的模板&#xff0c;包含项目管理、日报周报、信息收集等多种场景&#xff0c;帮助了解更多文档功能&#xff0c;助力日常工作。 权限管理新增了「成员加入确认」开关&#xff0c;开启后需要管理员确认才能添加成员&#xff0…

相爱相杀的在线帮助文档语雀、Baklib、石墨文档,到底有何区别?

在线帮助文档是现代企业不可或缺的一部分&#xff0c;它提供了针对特定产品或服务的详细说明和指南&#xff0c;以帮助用户更好地理解产品或服务并解决问题。目前市面上有许多在线帮助文档工具&#xff0c;其中语雀、Baklib和石墨文档是比较受欢迎的三种&#xff0c;本文将对它…

卸载旧版本Keil,安装新版本的注意事项以及安装完成以后的一些问题

1. 资料 这里使用的是MDK536安装包和Keil.STM32F4xx_DFP.2.16.0安装包&#xff08;因为板子是正点原子stm32F407的&#xff09;&#xff1b; 安装包放到下面&#xff08;安装包也是在网上找的&#xff0c;里面还是比较全的&#xff0c;有C51&#xff0c;以及注册机等&#xf…

只做笔记有必要买apple pencil吗?好写的电容笔排行榜

随着科技的发展&#xff0c;出现了许多新的电子器件和数码器件。比如智能手机&#xff0c;比如ipad&#xff0c;比如电容笔等等。但实际上&#xff0c;想要让ipad发挥出最大的作用&#xff0c;就必须要有一支好的电笔。就像是我们在ipad上写字&#xff0c;总是要手写&#xff0…