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

MySQL EXPLAIN,数据库调优的秘密通道

EXPLAIN 是 MySQL 中一个非常有用的工具,它用于分析 SQL 查询的执行计划。通过 EXPLAIN,你可以获取 MySQL 是如何准备执行你的 SQL 语句的,包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。

使用方法

EXPLAIN SELECT * FROM your_table WHERE some_column = 'some_value';

输出字段

  1. id:
    查询的标识符。如果查询包含多个子查询或联合查询,MySQL 会为每个子查询分配一个唯一的 id。
    如果 id 相同,表示这些查询是并行执行的。
    如果 id 不同,通常是外层查询的 id 较小,内层查询的 id 较大。
  2. select_type:
    查询的类型,常见的类型有:
    • SIMPLE: 简单的 SELECT 查询,不使用 UNION 或子查询。
    • PRIMARY: 查询中最外层的 SELECT。
    • UNION: UNION 中的第二个或后续的 SELECT 语句。
    • DEPENDENT UNION: UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。
    • SUBQUERY: 子查询中的第一个 SELECT。
    • DEPENDENT SUBQUERY: 子查询,依赖于外部查询。
    • DERIVED: 派生表的 SELECT(子查询在 FROM 子句中)。
  3. table:
    显示这一行数据是关于哪张表的。
  4. partitions:
    匹配的分区。
  5. type:
    连接类型,表示 MySQL 在找到所需行时使用的访问方法。常见类型有:
    • ALL: 全表扫描,性能最差。
    • index: 全索引扫描(索引的每一行都会被扫描)。
    • range: 使用索引选择给定范围的行。
    • ref: 使用非唯一性索引或唯一性索引的前缀扫描来查找单个匹配行。
    • eq_ref: 使用唯一性索引查找单个匹配行。
    • const, system: 表中最多有一个匹配行,通常在主键或唯一索引中查找。
    • NULL: 不用访问表或索引,例如从子查询中返回的行。
  6. possible_keys:
    显示可能应用在这张表上的索引。
  7. key:
    实际使用的索引。如果为 NULL,则表示没有使用索引。
  8. key_len:
    使用的索引的长度。在某些情况下,不是索引的全部部分都会被使用。
  9. ref:
    显示索引的哪一列或常量被用于查找值。
  10. rows:
    估计为了找到所需的行而要检查的行数。这是一个估计值,不一定完全准确。
  11. filtered:
    表示返回结果的行占开始查找行的百分比。
  12. Extra:
    包含不适合在其他列中显示但对执行计划非常重要的额外信息。常见值有:
  • Using where: 使用 WHERE 过滤。
  • Using temporary: 使用临时表来存储中间结果。
  • Using filesort: MySQL 需要额外的步骤来执行排序。
  • Using index: 只通过索引树读取数据(覆盖索引)。
  • Impossible WHERE: WHERE 子句中的条件永远为 false,不能返回任何行。
  • Distinct: MySQL 正在查找不同的值。

基本使用

假设有一个名为 employees 的表,包含 id, name, department_id, salary 等列,并且有一个索引 idx_department_id 在 department_id 列上。

EXPLAIN SELECT * FROM employees WHERE department_id = 10;

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesrefidx_department_ididx_department_id4const100Using where
  • type 为 ref,表示使用了非唯一索引查找。
  • key 为 idx_department_id,表示实际使用的索引。
  • rows 为 100,表示估计需要检查的行数。

案例

定义

我们有一个名为 employees 的表,包含以下列:id(主键),name,department_id,salary。我们想要查询 department_id 为 10 的所有员工信息。

-- 假设 employees 表已经存在并且包含数据
EXPLAIN
SELECT *
FROM employees
WHERE department_id = 10;

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesrefidx_department_ididx_department_id4const100Using where
  • id: 查询的标识符,这里只有一个查询,所以为 1。
  • select_type: 查询类型,SIMPLE 表示简单的 SELECT 查询。
  • table: 查询的表名,这里是 employees。
  • type: 连接类型,ref 表示使用非唯一索引或唯一索引的前缀来查找匹配的行。
  • possible_keys: 可能使用的索引,这里是 idx_department_id。
  • key: 实际使用的索引,这里是 idx_department_id。
  • key_len: 使用的索引的长度。
  • ref: 显示索引的哪一列或常量被用于查找值,这里是 const 表示是一个常量值。
  • rows: 估计为了找到所需的行而要检查的行数。
  • Extra: 额外的信息,这里是 Using where 表示使用了 WHERE 子句进行过滤。

全表扫描

现在我们想要查询所有员工的姓名,并且我们没有在 name 列上创建索引。

-- 假设 employees 表已经存在并且包含数据,且 name 列上没有索引
EXPLAIN
SELECT name
FROM employees;

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesALLNULLNULLNULLNULL1000000NULL
  • type: 这里是 ALL,表示全表扫描,因为 name 列上没有索引。
  • possible_keys 和 key: 都是 NULL,因为没有可用的索引。
  • rows: 估计需要扫描的行数,这里是一个较大的数,表示全表扫描。

使用覆盖索引

假设我们现在在 name 和 salary 列上创建了一个复合索引,并且我们想要查询这两个列的值。

-- 首先创建复合索引(如果尚未存在)
CREATE INDEX idx_name_salary ON employees (name, salary);-- 然后使用 EXPLAIN 查看查询计划
EXPLAIN
SELECT name, salary
FROM employees
WHERE name = 'John Doe';

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesrefidx_name_salaryidx_name_salary767const1Using index
  • type: 这里是 ref,表示使用非唯一索引查找。
  • key: 使用了我们刚刚创建的复合索引 idx_name_salary。
  • Extra: Using index 表示只通过索引树读取数据(覆盖索引),因为查询的列 name 和 salary 都包含在索引中。

相关文章:

MySQL EXPLAIN,数据库调优的秘密通道

EXPLAIN 是 MySQL 中一个非常有用的工具,它用于分析 SQL 查询的执行计划。通过 EXPLAIN,你可以获取 MySQL 是如何准备执行你的 SQL 语句的,包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。 使…...

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求: 要求在任务截止日期的前3天时,系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单,没有使用消息列队,也不能使用延时队列来做。 用Timer的话开销还挺大的&a…...

如何基于Tesseract实现图片的文本识别

在前一篇文章基础上,如何将报告图片中的文本解析出来,最近研究了基于Tesseract的OCR方案,Tesseract OCR是一个开源的OCR引擎,主要结合开源的tesseract和pytesseract,实现了jpg/png等格式图片文本识别,供大家…...

JavaWeb之AJAX

前言 这一节讲JavaWeb之AJAX 1.概述 以前我们在servlet中得到数据,必须通过域给jsp,然后jsp在响应给浏览器 纯html不能获取servlet返回数据 所以我们用jsp 但是现在我们可以同AJAX给返回数据了 我们可以在sevlet中直接通过AJAX返回给浏览器 html中的J…...

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…...

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…...

linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容

1.打开终端切换到virtualBox安装目录 2.输入命令扩容 如上终端中的代码解释: D:\Program Files\Oracle\VirtualBox>.\VBoxManage modifyhd D:\ubuntu18.04\Ubuntu18.04\Ubuntu18.04.vdi --resize 40960如上代码说明:D:\Program Files\Oracle\Virtual…...

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程:路由(Routing)(四)一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…...

华为Ensp模拟器配置RIP路由协议

目录 RIP路由详解:另一种视角解读 1. RIP简介:轻松理解基础概念 2. RIP的核心机制:距离向量的魅力 3. RIP的实用与局限 RIP配置实验 实验图 ​编辑 PC的ip配置 RIP配置步骤 测试 结语:RIP的今天与明天 RIP路由详解&…...

3. langgraph中的react agent使用 (在react agent添加系统提示)

环境准备 确保你已经安装了以下库: langchainlangchain_openailanggraph 你可以使用以下命令进行安装: pip install langchain langchain_openai langgraph代码实现 1. 初始化模型 首先,我们需要初始化智谱AI的聊天模型。 from langch…...

(02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数

目录 前言 一、Map Maps 和 Objects 的区别 Map的迭代 forEach() Map对象的操作 二、Set Set 中的特殊值 三、Reflect 四、Proxy 五、字符串 六、数值 七、对象 八、数组 九、函数 参考文献 前言 一、Map Map 对象保存键值对。任何值(对象或者原始值) 都可以…...

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里? 1、一个问题: 2、查看消费者消费主题__consumer_offsets 3、一个重要前提:消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了,你重启kafka之后&#xff0…...

C++ 的发展

目录 C 的发展总结:​编辑 1. C 的早期发展(1979-1985) 2. C 标准化过程(1985-1998) 3. C 标准演化(2003-2011) 4. C11(2011年) 5. C14(2014年&#xf…...

RabbitMQ 高级特性——延迟队列

文章目录 前言延迟队列延迟队列的概念TTL 死信队列模拟延迟队列设置队列的 TTL设置消息的 TTL 延迟队列插件安装并且启动插件服务使用插件实现延迟功能 前言 前面我们学习了 TTL 和死信队列,当队列中的消息达到了过期时间之后,那么这个消息就会被死信交…...

‌EAC(Estimate at Completion)和ETC(Estimate to Complete)

‌EAC 预计完工成本ETC 预计尚需成本Estimate at CompletionEstimate to Complete完成预估完工时尚需成本估算 EAC ETC ACETC EAC – AC 预测项目总成本,包含了到目前为止实际发生的成本(AC)和预计将发生的成本。如果EAC大于BAC&#xf…...

【React】状态管理之Zustand

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 状态管理之Zustand引言1. Zustand 的核心特点1.1 简单直观的 API1.2 无需 Provi…...

Vue3打包自动生成版本JSON文件,添加系统版本检查,实现系统自动更新提示

实现该功能一共有三步。废话不多说,直接上代码!!! 第一步:打包时自动生成版本信息的js文件,versionUpdate.js import fs from fs; import path from path; import { ElMessageBox } from element-plus; i…...

海量数据有限内存系列问题解决方案

1. 排序问题 有限数据充足内存:内存中有十万整数,对所有数据进行排序。 内部排序即可 单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,对所有数据…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame,然后再次转成 AVPacket,那么这AVPakcet数据要怎么办呢?分为三种情况: 一种是将AVPacket存储成h264文件,由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…...

内容占位符:Kinetic Loader HTML+CSS 使用CSS制作三角形原理

内容占位符 前言 随着我们对HTML和CSS3的学习逐渐深入,相信大家都已经掌握了网页制作的基础知识,包括如何使用HTML标记构建网页结构,以及如何运用CSS样式美化页面。为了进一步巩固和熟练这些技能,今天我们一起来完成一个有趣且实…...

麒麟nginx配置

一、配置负载均衡 配置麒麟的yum源 vim /etc/yum.repos.d/kylin_aarch64.repo Copy 删除原来内容,写入如下yum源 [ks10-adv-os] name Kylin Linux Advanced Server 10 - Os baseurl http://update.cs2c.com.cn:8080/NS/V10/V10SP2/os/adv/lic/base/aarch64/ …...

如何在 Ubuntu 上安装 Emby 媒体服务器

Emby 是一个开源的媒体服务器解决方案,它能让你整理、流媒体播放和分享你的个人媒体收藏,包括电影、音乐、电视节目和照片。Emby 帮你集中多媒体内容,让你无论在家还是在外都能轻松访问。它还支持转码,让你能够播放各种格式的内容…...

Mac上详细配置java开发环境和软件(更新中)

文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan.baidu.com/s/17…...

jmeter常用配置元件介绍总结之定时器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之定时器 5.定时器5.1.固定定时器5.2.统一随机定时器5.3.Precise Throughput Timer5.4.Constant Throughput Timer5.5.Synchronizing Timer5.6.泊松随机定时器5.7.高斯随机定时器 5.定时器 5.1.固定定时器 固定定时器Cons…...

Spring——提前编译

提前编译:AOT AOT概述 JIT与AOT的区别 JIT和AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译 (1)JIT, Just-in-time,动态(即时)编译,边运行边编译&#xff1…...

乐理的学习(音程)

二度,三度,六度,七度的大n度都是直接的音名到音名,如#A到#G的,这样为大n度 而这个基础上向内收,收半音为小n度,在小n度再收,为减n度 在大n度的基础上再向外扩半音,为增…...

【网络】数据链路层协议——以太网,ARP协议

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是以太网协议和ARP协议。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自&#xf…...

Linux分区、挂载、配额、逻辑卷、RAID、系统综合状态查看

分区与挂载 fdisk fdisk 命令是一个用于磁盘分区管理的命令行工具,可以用来创建、删除、调整分区等操作。常用的 fdisk 命令选项包括: fdisk -l:列出系统中的所有磁盘分区信息。 fdisk /dev/sdX:打开指定磁盘进行分区操作。 n&…...

3D Gaussian Splatting 代码层理解之Part1

2023 年初,来自蔚蓝海岸大学和 马克斯普朗克学会的作者发表了一篇题为“用于实时现场渲染的 3D 高斯泼溅”的论文。该论文提出了实时神经渲染的重大进步,超越了NeRF等以前方法的实用性。高斯泼溅不仅减少了延迟,而且达到或超过了 NeRF 的渲染质量,在神经渲染领域掀起了一场…...

Qt小知识-Q_GLOBAL_STATIC

你还在为创建全局静态对象烦恼嘛,它来了!它来了! qt5提供了两个宏定义Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS来实现。可以创建一个全局静态对象,对象在第一次使用时初始化自身,这意味着它不会增加应用程序或库的…...