MySQL EXPLAIN 详解:一眼看懂查询计划
在日常的数据库开发中,我们经常需要分析 SQL 查询性能,而 EXPLAIN 是 MySQL 提供的利器,可以帮我们快速理解查询计划,优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义,并结合实际案例分享优化思路。
一、什么是 MySQL EXPLAIN
EXPLAIN 是 MySQL 提供的一种查询分析工具,用来展示 SQL 查询的执行计划。它能直观地展示每个表的访问方式、索引的使用情况以及查询的执行顺序,帮助我们找出性能瓶颈。
使用方式:
EXPLAIN [你的SQL语句];
执行后会返回一张表格,展示查询执行的各项详细信息。
二、EXPLAIN 输出字段详解
以下是 EXPLAIN 的关键输出字段,每一列都表示不同的执行信息。
| 字段名 | 含义 | 优化建议 |
|---|---|---|
| id | 查询的执行顺序和优先级 | 优先优化 id 值大的语句 |
| select_type | 查询的类型 | 确保派生表和子查询的效率 |
| table | 当前步骤访问的表 | 注意优化复杂查询中的临时表 |
| partitions | 匹配的分区 | 分区表优化相关 |
| type | 表的访问方式(性能优劣排序) | 避免 ALL 全表扫描 |
| possible_keys | 查询中可能使用的索引 | 确保查询条件中使用了索引列 |
| key | 实际使用的索引 | 若为 NULL,需检查是否需要创建索引 |
| key_len | 使用索引的长度 | 确保索引覆盖了查询条件 |
| ref | 索引比较对象 | 确保通过条件有效筛选 |
| rows | 预估需要扫描的行数 | 扫描行数越少,性能越高 |
| filtered | 返回结果占扫描行数的百分比 | 值越接近 100%,过滤条件越高效 |
| Extra | 补充信息,如临时表、排序等 | 避免使用临时表、文件排序 |
三、EXPLAIN 字段详解及优化策略
1. id
- 含义:表示查询的执行顺序。
- 特点:
id值越大,优先执行。- 同一
id从上到下执行。
- 优化建议:优先优化
id值较大的查询。
2. select_type
- 常见值:
- SIMPLE:简单查询,没有子查询。
- PRIMARY:最外层查询。
- SUBQUERY:子查询。
- DERIVED:派生表(子查询的结果作为临时表)。
- UNION:
UNION中的查询。
3. type
- 访问方式性能排序:
- 最佳:
system>const>eq_ref>ref>range>index>ALL。 ALL(全表扫描):性能最差,应尽量避免。
- 最佳:
- 优化方法:
- 确保查询条件使用索引,避免全表扫描。
4. Extra
- 关键信息解读:
- Using index:使用覆盖索引,性能较优。
- Using where:通过
WHERE过滤条件筛选数据。 - Using temporary:使用了临时表,需优化。
- Using filesort:需要额外的排序步骤,尽量优化索引支持排序。
四、典型优化案例
以下通过实际案例,演示如何使用 EXPLAIN 分析和优化查询计划。
1. 优化全表扫描
原始查询:
EXPLAIN SELECT * FROM orders WHERE user_id = 1;
查询计划:
type=ALL表示全表扫描。- 优化方法:在
user_id列上添加索引。
ALTER TABLE orders ADD INDEX idx_user_id(user_id);
EXPLAIN SELECT * FROM orders WHERE user_id = 1;
2. 优化排序
原始查询:
EXPLAIN SELECT name FROM users WHERE age > 30 ORDER BY age DESC;
查询计划:
Extra=Using filesort表示需要额外排序。- 优化方法:在
age列上添加索引。
ALTER TABLE users ADD INDEX idx_age(age);
EXPLAIN SELECT name FROM users WHERE age > 30 ORDER BY age DESC;
3. 子查询改写为 JOIN
原始查询:
EXPLAIN SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE age > 30);
查询计划:
select_type=SUBQUERY,执行效率较低。- 优化方法:改写为
JOIN查询。
EXPLAIN SELECT o.* FROM orders o JOIN users u ON o.user_id = u.id WHERE u.age > 30;
五、总结
EXPLAIN是优化查询性能的重要工具,可以帮助我们清晰了解查询计划。- 重点关注字段:如
type、rows、Extra,避免全表扫描和文件排序。 - 索引是优化的核心:确保查询条件充分利用索引。
SQL 优化的核心原则:
- 合理设计索引。
- 避免全表扫描。
- 避免子查询,尽量使用 JOIN 替代。
**实践是优化的关键!**希望本文能帮你一眼看懂查询计划,并在实际项目中助你优化 SQL 性能!
你可以通过留言分享你的优化案例或遇到的疑难问题,一起交流探讨!
相关文章:
MySQL EXPLAIN 详解:一眼看懂查询计划
在日常的数据库开发中,我们经常需要分析 SQL 查询性能,而 EXPLAIN 是 MySQL 提供的利器,可以帮我们快速理解查询计划,优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义,并结合实际案例分享优化思路。 一、什么是…...
自动呼入机器人如何与人工客服进行无缝切换?
自动呼入机器人如何与人工客服进行无缝切换? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 自动呼入机器人与人工客服的无缝切换详解 自动呼入机器人与人工客服之间的无缝切换是确保客户体验连续…...
二分类模型的性能评价指标
1. 混淆矩阵 (Confusion Matrix) 预测正类预测负类实际正类 (P)True Positive (TP)False Negative (FN)实际负类 (N)False Positive (FP)True Negative (TN) True Positive (TP): 模型正确预测为正类的样本数。True Negative (TN): 模型正确预测为负类的样本数。False Positi…...
鸿蒙操作系统简介
华为鸿蒙系统(HUAWEI HarmonyOS),是华为公司于2019年8月9日在东莞举行的华为开发者大会(HDC.2019)上正式发布的面向全场景的分布式操作系统,可以创造一个超级虚拟终端互联的世界,将人、设备、场…...
单片机:实现蜂鸣器数码管的显示(附带源码)
单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示,而数码管则用于显示数字或字母。在本项目中,我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统,结合使用蜂鸣器和数码管…...
C语言期末复习笔记(上)
目录 一、为什么要学习C语言 1.C语言适合做什么 2.开发C程序的步骤 3.常用术语 二、C语言数据结构 1.常量与变量 (1)常量 编辑 (2)变量 2.数据类型 编辑 (1)数据类型的分类 (2&a…...
HarmonyOS 实时监听与获取 Wi-Fi 信息
文章目录 摘要项目功能概述代码模块详细说明创建 Wi-Fi 状态保存对象Wi-Fi 状态监听模块获取当前 Wi-Fi 信息整合主模块 运行效果展示性能分析总结 摘要 本文展示了如何使用 HarmonyOS 框架开发一个 Demo,用于监听手机的 Wi-Fi 状态变化并实时获取连接的 Wi-Fi 信息…...
Unity超优质动态天气插件(含一年四季各种天气变化,可用于单机局域网VR)
效果展示:https://www.bilibili.com/video/BV1CkkcYHENf/?spm_id_from333.1387.homepage.video_card.click 在你的项目中设置enviro真的很容易!导入包裹并按照以下步骤操作开始的步骤! 1. 拖拽“EnviroSky”预制件(“environme…...
1 JVM JDK JRE之间的区别以及使用字节码的好处
JDK jdk是编译java源文件成class文件的,我们使用javac命令把java源文件编译成class文件。 我们在java安装的目录下找到bin文件夹,如下图所示: 遵循着编译原理,把java源文件编译成JVM可识别的机器码。 其中还包括jar打包工具等。主要是针对…...
【网络安全】网站常见安全漏洞—服务端漏洞介绍
文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞?如何防范? 2. SQL 注入什么是SQL注入?如何防范? 3. 命令执行漏洞什么是命令执行漏洞?如何防范? 4. 越权漏洞什么是越…...
MAPTR:在线矢量化高精地图构建的结构化建模与学习(2208)
MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION MAPTR:在线矢量化高精地图构建的结构化建模与学习 ABSTRACT High-definition (HD) map provides abundant and precise environmental information of the driving scene, se…...
基于容器的云原生,让业务更自由地翱翔云端
无论是要构建一个应用或开发一个更庞大的解决方案,在技术选型时,技术的开放性和可移植性已经成为很多企业优先考虑的问题之一。毕竟没人希望自己未来的发展方向和成长速度被自己若干年前选择使用的某项技术所限制或拖累。 那么当你的业务已经上云&#x…...
大屏开源项目go-view二次开发2----半环形控件(C#)
环境搭建参考: 大屏开源项目go-view二次开发1----环境搭建(C#)-CSDN博客 要做的半环形控件最终效果如下图: 步骤如下: 1 在go-view前端项目的\src\packages\components\Charts目录下新增Others目录,并在Others目录下新增PieExt…...
web:pc端企业微信登录-vue版
官方文档:developer.work.weixin.qq.com/document/pa… 不需要调用ww.register,直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…...
OpenGL ES 01 渲染一个四边形
项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…...
【ETCD】【源码阅读】深入解析 EtcdServer.applyEntries方法
applyEntries方法的主要作用是接收待应用的 Raft 日志条目,并按顺序将其应用到系统中;确保条目的索引连续,避免丢失或重复应用条目。 一、函数完整代码 func (s *EtcdServer) applyEntries(ep *etcdProgress, apply *apply) {if len(apply.…...
概率论得学习和整理28:用EXCEL画折线图,X轴数据也被当成曲线的解决办法
目录 1 折线图和散点图,对数据的处理差别 1.1 EXCEL画图的一些默认设置 1.2 多于2列的数据,也是如此 2 如果我们非要以第1列数据为X轴,做一个折线图呢?也能 2.1 首先,把第1列,想当成X轴的数据…...
tryhackme-Pre Security-Defensive Security Intro(防御安全简介)
任务一:Introduction to Defensive Security防御安全简介 此room的两个要点: Preventing intrusions from occurring 防止入侵发生Detecting intrusions when they occur and responding properly 检测发生的入侵并正确响应 防御安全还有更多内容。 除上…...
27. 元类
一、什么是元类 在 Python 中,一切皆为对象,即类也是一个对象。type 是内置的元类。我们用 class 关键字定义的所有的类以及内置的类都是由元类 type(内置的元类) 实例化产生的。 class Person:def __init__(self, name, age):se…...
PHP木马编写
一、最简单的一句话木马 <?php eval($_REQUEST[cmd]); ?> 1. <?php 和 ?> <?php 和 ?> 是 PHP 代码的开始和结束标记,表示 PHP 代码块的范围。 2. eval() eval() 是 PHP 中的一个内建函数,用来执行字符串类型的 PHP 代码。…...
OpenClaw配置备份指南:Qwen3-4B模型参数迁移方案
OpenClaw配置备份指南:Qwen3-4B模型参数迁移方案 1. 为什么需要配置备份 上周我的主力开发机突然硬盘故障,导致辛苦配置了两个月的OpenClaw环境全部丢失。最痛苦的不是重装软件,而是那些精心调试的模型参数、飞书机器人凭证和自定义技能配置…...
SecGPT-14B模型微调:提升OpenClaw安全任务执行准确率
SecGPT-14B模型微调:提升OpenClaw安全任务执行准确率 1. 为什么需要微调SecGPT-14B 去年我在使用OpenClaw自动化执行安全扫描任务时,经常遇到一个头疼的问题:当Agent尝试分析漏洞报告时,基础模型总是把"SSRF漏洞"和&q…...
终极Kando多语言指南:如何快速实现跨平台饼状菜单的国际化支持
终极Kando多语言指南:如何快速实现跨平台饼状菜单的国际化支持 【免费下载链接】kando 🌸 Do things with utmost efficiency. 项目地址: https://gitcode.com/gh_mirrors/ka/kando Kando是一款高效的跨平台饼状菜单工具,通过直观的径…...
POIKit:地理数据全流程处理的高效解决方案
POIKit:地理数据全流程处理的高效解决方案 【免费下载链接】AMapPoi POI搜索工具、地理编码工具 项目地址: https://gitcode.com/gh_mirrors/am/AMapPoi 价值定位:重新定义地理数据采集效率 行业痛点与技术突破 在地理信息领域,传统…...
OpenClaw + Seedance 2.0实战:从零搭建全自动AI视频生成流水线
OpenClaw Seedance 2.0实战:从零搭建全自动AI视频生成流水线 前言 这篇记录我用OpenClaw Agent串联Seedance 2.0满血版API,搭建全自动视频生产流水线的完整过程。包括架构设计、Skill编写、API调用细节和踩坑记录。 一、架构设计 用户输入ÿ…...
0基础入门网络安全必练这两个靶场!挖漏洞必先从刷靶场开始
0基础入门网络安全必练这两个靶场!挖漏洞必先从刷靶场开始 第一「皮卡丘」 它是国内几个安全大佬专门给小白开发的中文靶场,界面非常简洁而且操作友好,真的也算是我刚入门时候的一个实战老师 和其他靶场不同,它既可以动手练习还…...
数据处理与统计分析----沙箱
命令行操作沙箱...
Arduino驱动OV7670图像传感器:底层时序与跨平台实现
1. Arduino_OV767X 库深度解析:OV7670 CMOS 图像传感器在 Arduino 平台上的底层驱动与工程实践OV7670 是 OmniVision(现属韦尔半导体)于 2000 年代初推出的超低功耗、单芯片 QVGA(320240)彩色 CMOS 图像传感器。其采用…...
寒武纪高级系统软件工程师面试技术解析
1. 寒武纪高级系统软件工程师面试全解析 作为一名在芯片验证领域摸爬滚打多年的工程师,去年我经历了寒武纪高级系统软件工程师岗位的完整面试流程。这个岗位对系统底层和芯片验证的要求非常高,今天我就把两轮技术面的核心问题拆解给大家,并分…...
OpenClaw+Phi-3-vision-128k-instruct图文处理实战:本地部署与多模态任务自动化
OpenClawPhi-3-vision-128k-instruct图文处理实战:本地部署与多模态任务自动化 1. 为什么选择这个技术组合? 去年我开始尝试用AI处理日常工作中的图文混合内容时,遇到了一个典型困境:现有的云端多模态服务要么价格昂贵ÿ…...
