当前位置: 首页 > news >正文

常见面试题-MySQL的Explain执行计划

了解 Explain 执行计划吗?

答:

explain 语句可以帮助我们查看查询语句的具体执行计划。

explain 查出来的各列含义如下:

  • id:在一个大的查询语句中,每个 select 关键字都对应一个唯一的 id

  • select_type:select 关键字对应的那个查询的类型

    • simple:简单查询。表示查询不包含子查询和union

    • primary:复杂查询中最外层的 select

    • subquery:包含在 select 中的子查询(不在 from 子句中)

    • derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)

      set session optimizer_switch='derived_merge=off';  #关闭 mysql5.7 新特性对衍生表的合并优化
      explain select (select 1 from employees where id = 5) from (select * from account where id = 3) der;
      set session optimizer_switch='derived_merge=on'; #还原默认配置
      

在这里插入图片描述

  • union:在 union 中的第二个和随后的 select

    explain select 1 union all select 1;
    

  • partitions:匹配的分区信息

  • type:表示访问类型,即 MySQL 决定如何查找表中的行。从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL

    一般来说得保证查询达到 range 级别,最好达到 ref

    • Null:表示 MySQL 在优化阶段分解查询语句,执行时不需要再访问表或索引。例如 explain select min(id) from account; 在索引列中取最小值,单独查询索引即可,执行时不需要再访问表

    • system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如 explain select * from test;test 表中只有一条数据,如果 test 表使用 MyISAM 存储引擎,则 type 为 system;如果 test 表使用 InnoDB 存储引擎,则 type 为 ALL

    • const:const 表示代价时常数级别,当根据主键索引、唯一索引、二级索引与常数进行等值匹配时,对单表访问就是 const,只匹配到一行数据,很快.

      explain select * from account where id = 1

    • eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。

      explain select * from t1 left join t2 on t1.id=t2.id

    • ref:相比于 eq_ref,不使用唯一索引,使用普通索引或者唯一索引的部分前缀,索引值和某个值相比较,可能找到多个符合条件的行

      name 是普通索引(非唯一索引),explain select * from account where name = 'abc'

    • range:范围扫描通常出现在 in()between><等操作

    • index:扫描全索引就能拿到结果,一般是扫描某个二级索引,会直接对二级索引的叶子节点遍历和扫描。这种查询一般为使用了覆盖索引,二级索引比较小,所以通常比 ALL 快一些

    • ALL:全表扫描,扫描聚簇索引的所有叶子节点,通常情况下这需要增加索引来进行优化

  • possible_keys:可能用到的索引

    查询时可能出现 possible_keys 有列,但是 key 显示 Null 的情况,这是因为表中数据不多,MySQL 认为索引帮助不大,选择了全表扫描

    如果该列是 Null,说明没有相关索引,可以通过添加索引来提高查询性能

  • key:实际上使用的索引

    如果为 Null 表示没有使用索引,可以使用 force indexignore index 来强制使用索引

  • key_len:实际使用到的索引长度

    key_len 计算规则如下:

    • 字符串,char(n)、varchar(n) 在 5.0.3 之后,n 代表字符数,而不是字节数,如果是 utf-8,一个数字或字母占 1 个字节,1 个汉字占 3 个字节
      • char(n):如果存汉字,长度为 3n 字节
      • varchar(n):
        • 如果存汉字(utf8),长度为 3n+2 字节,加的 2 字节用来存储字符串长度(varchar 是变长字符串)
        • 如果存汉字(utf8-mb4),长度为 4n+2 字节
    • 数值类型
      • tinyint:1 字节
      • smallint:2 字节
      • int:4 字节
      • bigint:8 字节
    • 时间类型:
      • date:3 字节
      • timestamp:4 字节
      • datetime:8 字节
    • 如果字段允许为 Null,则还需要 1 字节记录是否为 Null

    计算示例:

    • 设置索引:idx_balance(balance)explain select name from account where balance = '111' ;

      该 SQL key_len = 5,4 个字节用于存储 balance(int,4B),1 个字节记录是否为 Null

    • 设置索引:idx_name(name),name 字段编码为 uft8-mb4,长度为varchar(10),explain select name from account where name = 'abc';

      该 SQL key_len = 43,name 索引长度为 10,使用 utf8-mb4 存储汉字的话,1 个汉字占 4 个字节,长度为 10 所占用字节为 4 * 10 = 40,还需要 2 个字节存储 varchar 的长度,name 字段可以为空,因此还需要 1 个字节记录是否为 Null,因此 name 索引的长度为 40 + 2 + 1 = 43

      如果是 utf-8 编码,1 个汉字是占 3 个字节的。

  • ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息,常见的 ref 值有:const(常量),字段名(例如:film.id)

  • rows:预估的需要读取的记录条数,并不是结果集中的行数

  • Extra:—些额外的信息,常见的重要值如下:

    • Using index:使用覆盖索引
    • Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖
    • Using index condition:查询的列不完全被索引覆盖,where 条件中是一个前导列的范围
      • 示例:索引(name,balance) explain select *from account where name > 'a';
    • Using temporary:mysql 需要创建一张临时表来处理查询。出现这种情况需要使用索引进行优化
      • 示例:name 字段没有索引,此时创建一张临时表来 distinct,explain select distinct name from account
    • Using filesort:使用外部排序而不是索引排序,数据较少时在内存中排序,数据较大时在磁盘中排序,一般情况下也是需要考虑使用索引进行优化
      • 示例:name 字段没有索引,explain select name from account order by name
    • Select tables optimized away:使用聚合函数来访问存在索引的某个字段
      • 示例:explain select min(id) from account;

相关文章:

常见面试题-MySQL的Explain执行计划

了解 Explain 执行计划吗&#xff1f; 答&#xff1a; explain 语句可以帮助我们查看查询语句的具体执行计划。 explain 查出来的各列含义如下&#xff1a; id&#xff1a;在一个大的查询语句中&#xff0c;每个 select 关键字都对应一个唯一的 id select_type&#xff1a;…...

SpringBoot静态资源配置

项目中 SSM中配置 第一种&#xff1a;配置文件中 <mvc:resources mapping"/js/**" location"/js/"/> <mvc:resources mapping"/css/**" location"/css/"/> <mvc:resources mapping"/html/**" location&q…...

Java拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…...

Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面

目的概述&#xff1a;因不想后台直接操作&#xff08;操作不便&#xff09;&#xff0c;所以想到能否基于xrdp协议服务利用 win自带的远程桌面服务&#xff0c;链接到后台&#xff0c;类似于vnc的使用方式&#xff0c;涉及操作系统版本&#xff1a;win11 、 CentOS 7.4 、CentO…...

Java 实现随机图形

要求 定义4个类&#xff0c;MyShape、MyLine、MyRectangle和MyOval&#xff0c;其中MyShape是其他三个类的父类。MyShape为抽象类&#xff0c;包括图形位置的四个坐标&#xff1b;一个无参的构造方法&#xff0c;将所有的坐标设置为0&#xff1b;一个带参的构造函数&#xff0…...

java 读写文件的代码。

java 读写文件的代码。 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStr…...

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…...

文本向量化

文本向量化表示的输出比较 import timeimport torch from transformers import AutoTokenizer, AutoModelForMaskedLM, AutoModel# simcse相似度分数 def get_model_output(model, tokenizer, text_str):"""验证文本向量化表示的输出:param model: 模型的…...

java--贪吃蛇

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random;public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {int slong 2;//蛇当前长度//蛇坐标int[] Snakex new int[100];int[] Snakey new…...

录制第一个jmeter性能测试脚本2(http协议)

我们手工编写了一个测试计划&#xff0c;现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似&#xff1a;让5个用户在2s内登录webtour&#xff0c;然后进入 页面进行查看。 目录 一.性能测试脚本录制的原理 二、性能测试脚本录制的实操&#…...

pip命令大全

pip命令手册 原版 Usage: pip <command> [options]Commands:install Install packages.download Download packages.uninstall Uninstall packages.freeze Output installed packages…...

Redis篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、为什么 使用 Redis 而不是用 Memcache 呢?二、为什么 Redis 单线程模型效率也能那么高?三、说说 Redis 的线程模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…...

【LeetCode刷题日志】232.用栈实现队列

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;LeetCode 刷题日志&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;…...

单元测试实战(二)Service 的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&#x…...

LabVIEW和NIUSRP硬件加快了认知无线电开发

LabVIEW和NIUSRP硬件加快了认知无线电开发 对于电视频谱&#xff0c;主用户传输有两种类型&#xff1a;广播电视和节目制作和特殊事件(PMSE)设备。广播塔的位置已知&#xff0c;且覆盖电视传输塔&#xff08;复用器&#xff09;附近的某个特定地理区域&#xff08;称为排除区域…...

嵌入式软件工程师面试题——2025校招社招通用(十六)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…...

白盒测试之测试用例设计方法

白盒测试之测试用例设计方法 什么是白盒测试白盒测试的特点白盒测试的设计方法静态设计方法动态设计方法语句覆盖分支(判定)覆盖条件覆盖判定条件覆盖组合覆盖路径覆盖总结 什么是白盒测试 按照测试方法分类&#xff0c;测试可以分为白盒测试和黑盒测试两种。 白盒测试也称结构…...

在CentOS 7上关闭SELinux

要在CentOS 7上关闭SELinux&#xff0c;可以按照以下步骤进行操作&#xff1a; 临时关闭SELinux&#xff08;不建议使用&#xff09;&#xff1a; setenforce 0但是这种方式只对当前启动有效&#xff0c;重启系统后会失效。 2. 永久关闭SELinux&#xff1a; vi /etc/selinux…...

基于单片机温湿度PM2.5报警系统

**单片机设计介绍&#xff0c; 基于单片机温湿度PM2.5报警设置系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 单片机温湿度PM2.5报警设置系统是一种智能化的环境检测与报警系统。它主要由单片机、传感器、液晶显示屏、蜂鸣器…...

OpenHarmony系统编译环境

1. 推荐系统Ubuntu 2204 2. 必须安装的软件 apt-get install curl build-essential gcc g make ninja-build cmake libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils cpio de…...

StemRoller安全与沙盒:保护用户数据的最佳实践

StemRoller安全与沙盒&#xff1a;保护用户数据的最佳实践 【免费下载链接】stemroller Isolate vocals, drums, bass, and other instrumental stems from any song 项目地址: https://gitcode.com/gh_mirrors/st/stemroller StemRoller是一款能够从任何歌曲中分离人声…...

OpenClaw飞书机器人进阶:Qwen3.5-9B图片问答自动回复

OpenClaw飞书机器人进阶&#xff1a;Qwen3.5-9B图片问答自动回复 1. 为什么选择OpenClaw飞书Qwen3.5-9B组合&#xff1f; 去年我们团队内部遇到一个典型问题&#xff1a;产品文档和功能说明分散在各个Confluence页面&#xff0c;新同事遇到界面不熟悉时&#xff0c;老员工需要…...

LoRa网关实战:5分钟搞定MQTT通信(附Java代码示例)

LoRa网关实战&#xff1a;5分钟搞定MQTT通信&#xff08;附Java代码示例&#xff09; 在物联网项目开发中&#xff0c;LoRa网关与服务器的高效通信是确保数据可靠传输的关键环节。MQTT协议凭借其轻量级、低功耗的特性&#xff0c;成为连接LoRa设备与云端服务的首选方案。本文将…...

Pixel Couplet Gen应用场景:微信小程序‘灵蛇贺岁’互动模块开发全解析

Pixel Couplet Gen应用场景&#xff1a;微信小程序灵蛇贺岁互动模块开发全解析 1. 项目背景与核心价值 在传统节日数字化呈现的浪潮下&#xff0c;我们开发了"灵蛇贺岁"微信小程序互动模块。这款基于ModelScope大模型的春联生成器&#xff0c;通过创新的像素游戏风…...

nnUNet实战:如何根据你的显卡显存,手动调整batch_size和patch_size(附代码)

nnUNet显存优化实战&#xff1a;精准调整batch_size与patch_size的黄金法则 当你第一次在本地运行nnUNet训练脚本时&#xff0c;看到那个刺眼的CUDA out of memory错误&#xff0c;是不是有种功亏一篑的挫败感&#xff1f;别担心&#xff0c;这不是你的代码问题&#xff0c;而是…...

三菱现代自动擦窗机器人PLC软件:后发产品介绍及技术细节

三菱 现代自动擦窗机器人PLC软件 我们主要的后发送的产品有&#xff0c;带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面 界面多种组态可供选择上周刚帮一个三菱现代贴牌擦窗机的小客户把新软件迭代完&#xff0c;顺便攒了一套带人话解释的梯形图、不…...

SEO优化对网站收录有什么作用

SEO优化对网站收录有什么作用 在当今互联网信息爆炸的时代&#xff0c;网站的收录问题显得尤为重要。SEO优化对于网站的收录有着至关重要的作用&#xff0c;无论是对于新开的网站还是已经运营一段时间的网站&#xff0c;优化都能为其带来更多的流量和潜在客户。SEO优化对网站收…...

精益生产线功能拆解:如何利用精益生产线解决多品种小批量生产难题

在当前的制造业环境中&#xff0c;订单碎片化已成为常态&#xff0c;精益生产线不再是一个可选的优化项&#xff0c;而是企业生存的必修课。面对多品种、小批量的市场需求&#xff0c;传统的大批量流水线往往显得笨重不堪&#xff0c;频繁换型导致的停机、在制品积压造成的资金…...

永磁同步电机矢量控制仿真避坑指南:从PI参数整定到SVPWM模块优化

永磁同步电机矢量控制仿真避坑指南&#xff1a;从PI参数整定到SVPWM模块优化 在工业自动化和电力驱动领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;凭借其高效率、高功率密度和优异的动态性能&#xff0c;已成为众多应用场景的首选。然而&#xff0c;要实现PMSM的…...

2026届必备的五大AI辅助论文助手实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于大语言模型与自然语言处理技术的 AI 写作软件&#xff0c;是内容生产领域新兴工具&…...