Mysql中的执行计划怎么分析?
一、背景
在我们日常工作中,我们可能会遇到一些慢SQL语句或者要对一些SQL进行性能优化,那么就需要使用explain对SQL进行执行计划分析了。Mysql中的执行计划可以通过EXPLAIN或DESCRIBE关键字获取,当我们拿到执行计划后可以帮助我们分析这条sql执行的性能瓶颈在哪里。
例如,我有一张user表,我想分析一下查询的执行计划。
SELECT * FROM user WHERE age > 28;
可以使用EXPLAIN来获取这条sql语句的执行计划。
EXPLAIN SELECT * FROM user WHERE age > 28;
通过执行上面的EXPLAIN语句后,我们就能拿到这条sql的执行计划了。
+----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table| partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user | NULL | range| age | age | 5 | NULL | 50| 33.33 | Using where |
+----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
接下来我们就可以对执行计划进行分析了。
二、执行计划分析
从上面的执行计划可以看到,一共有12个字段,我们先对这些字段依次介绍一下。
1. id
执行计划中每个操作的唯一标识,对于执行计划中的每条sql,可能会有多个操作,每个操作都有一个唯一的id。
2. select_type
操作类型,一共包含一项几种类型:
- SIMPLE:表示这个查询是最简单的形式,不包含任何的子查询或联合查询。
- PRIMARY:表示查询中的最外层或最顶层SELECT,它内部可能会包含嵌套的子查询或其它复杂构造。
- SUBQUERY:表示这种类型的SELECT出现在了另外一个查询的from字句或where字句查询中,作为独立的查询被执行。
- DEPENDENT SUBQUERY:类似于SUBQUERY,这个子查询的执行依赖于外部查询的某一行,它会为外部查询的每一行执行一次。
- DERIVED:表示MySQL需要创建一张临时表来存储子查询的结果。
- UNCACHEABLE SUBQUERY:对于不能缓存结果的子查询,MySQL不能将它的值计算出来重复使用,而是在外部查询的时候每次都需要重新计算。
- UNION :出现在UNION查询中的第二个或后续的查询语句。
- UNION RESULT:用于合并UNION查询的结果集,不是实际的查询操作。
- MATERIALIZED:Mysql8.0引入的新类型,表示子查询结果被物化为临时表,以便重复使用。
3. table
当前操作锁涉及的表。
4. partitions
当前操作所涉及的分区。
5. type
表示MySQL在执行查询时所采用的检索方式,他是衡量查询性能的重要指标之一。以下时常用的类型和含义:
- system:系统表,数据量很少,往往不需要进行磁盘IO。
- const:表中仅有一行数据匹配,使用主键查询或唯一索引查询。
- eq_ref:使用主键或者唯一约束列,进行关联查询时使用。
- ref:非唯一索引扫描,只会扫描索引树中的一部分来查找匹配的行,使用非唯一索引进行查询时使用。
- range:范围扫描,使用索引进行范围查询,只会扫描索引树中的一个范围来查找匹配的行。
- index:全索引扫描,会遍历索引树来查找匹配的行。通常时不符合最左匹配的查询。
- all:全表扫描,当使用非索引字段查询时,将会遍历全表来找到匹配的行。
故以上类型执行效率由高到低:system > const > eq_ref > ref > range > index > all
6. possible_keys
表示查询中可以使用的索引,不一定实际使用了这些索引。这个字段列出了可能用于这个查询的所有索引,也包括联合索引。
7. key
表示实际查询使用的索引。
8. key_len
表示索引的长度,索引的长度越短,查询时的效率越高。
9. ref
用来表示哪些列或常量被用来与key列中命名的索引进行比较。
10. rows
表示操作需要扫描的行数,也就是说需要扫描表中多少行才能得到结果。
11. filtered
表示本次操作过滤掉的行数占扫描行数的百分比。值越大,则查询结果越准确。
12. extra
这个字段经常会被忽略,其实也很重要。这个字段表示MySQL在执行查询时所作的一些附加操作。下面是一些常见的extra类型及其含义:
- Using where:表示查询的列未被索引覆盖,或where筛选条件非索引列,或者where筛选条件非索引的前导列。
- Using index:本次查询使用了索引覆盖,只需要扫描索引,无需回表。
- Using index condition:表示本次查询在索引上执行了部分条件过滤。
- Using where;Using index:查询列被索引覆盖,并且where条件中使用了索引列,但不是索引的前导列。或者where条件是索引前导列的一个范围。通常是未遵循最左匹配原则。
- Using filesort:表示MySQL将使用文件排序,而不是索引排序,通常发生在无法使用索引来进行排序。我们应当尽量避免这种情况。
三、总结
通过对执行计划的各个字段进行了分析和说明,我们在进行sql优化的时候,尽可能使用最优的方式来提高性能。
相关文章:
Mysql中的执行计划怎么分析?
一、背景 在我们日常工作中,我们可能会遇到一些慢SQL语句或者要对一些SQL进行性能优化,那么就需要使用explain对SQL进行执行计划分析了。Mysql中的执行计划可以通过EXPLAIN或DESCRIBE关键字获取,当我们拿到执行计划后可以帮助我们分析这条sq…...
sever00启动AList
sever00启动AList cd ~/domains/alist && ~/.npm-global/bin/pm2 start ./alist -- server 其他 Serv00是一个提供免费的Virtual Host的平台,其托管平台使用的是FreeBSD系统,并不是Linux。每个账号有效期10年,超过三个月不登入Pan…...
【产品经理】进阶为一名优秀的数字孪生与仿真产品经理
数字孪生和仿真这个领域的内容太前沿了,很多经验、心得都没有对外流传。对于想成为这种产品经理的同学来说比较困难。 数字孪生:百度的解释是,数字孪生是充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多物理量、多尺…...
CloudCompare 二次开发(29)——最小二乘拟合平面
目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare实现的最小二乘拟合平面。具体计算原理见:PCL 最小二乘拟合平面。 二、代码集成 1、mainwindow.h文件public中添加: void doActionPCLLeastSquareFitPlane(); // 最小二乘拟合平面2、mainwindow.cpp文件…...
代码随想录算法训练营第三十五天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
860.柠檬水找零 本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。 https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 题目大意: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。 顾客排…...
28位驻华大使、公使参访苏州金龙 点赞刚刚全球发布的新V系大巴
3月26日下午,由外交部组织的“驻华使节团参访江苏”活动走进苏州金龙。来自28个国家和国际组织的驻华大使、公使参观了苏州金龙展厅,并试乘体验了苏州金龙全新V系大巴。外交部中国政府欧洲事务特别代表吴红波,外交部礼宾司、翻译司、非洲司、…...
jenkins权限分配
1.安装权限插件 Role-Based Strategy 2.创建用户 3.修改全局安全配置中的授权策略为Role-Based Strategy 4.进入Manage and Assign Roles创建Global roles和Item roles 4.进入Assign Roles给用户分配role...
感受精酿啤酒的啤酒屋那份与众不同的宁静与惬意
在繁华的都市中,隐藏着一片天地,那就是Fendi Club啤酒的啤酒屋。这里不仅提供上好的啤酒,还有与众不同的氛围和服务,让每一位顾客都能享受到宾至如归的感觉。 走进Fendi Club啤酒的啤酒屋,你会被其与众不同的装饰风格所…...
大数加法C++实现
题目:假设输入是2个数字,可能超过long long类型能表示的范围,请输出两数相加的运算结果。 思路:2个数输入的时候,肯定都是用string存的,先将短的数在末尾补0,使得二者一样长。然后挨个位相加&am…...
如何使用CHAT-AI?
伴随着CHAT-GPT的出现,人们都喜欢上了CHAT-AI。嗯?你还不会用?! 教程来喽! 首先点这里的 … 点击扩展 接着选择“管理扩展” 点击之后搜索“wetab” 最后你需要注册一个号,然后就可以使用CHAT-AI啦&#x…...
文献速递:基于SAM的医学图像分割--SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型
Title 题目 SAMUS: Adapting Segment Anything Model for Clinically-Friendly and Generalizable Ultrasound Image Segmentation SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型 01 文献速递介绍 医学图像分割是一项关键技术,用…...
23届嵌入式被裁,有什么好的就业建议?
最近看到了一个提问,原话如下: 本人23届毕业生,就业方向嵌入式软件,坐标深圳,工作3月公司裁员,目前接近12月开始找工作。 boss上投递简历,校招岗,比较有规模的好公司基本已读不回&am…...
你的 Python 代码需要解释一下了!
Python 是一种相对简单的编程语言。它主要以解释型语言著称,这意味着每行代码都要通过解释器逐行执行。不过在某些时候,将 Python 代码翻译成计算机可以理解的内容,然后再逐行执行,可以减少繁琐。 在这种情况下,编译器…...
听说,抖音小店要废除新手期了?没错!大动作来了!
大家好,我是电商小布。 一个项目从它的推出,到发展,再到成为行业的头部,都是需要不断进行完善的。 抖音小店这个项目也是一样。 这不,抖店平台在前两天又推出了新的通知,宣布废止新手期商家规范。 也就…...
【Java程序设计】【C00351】基于Springboot的疫情居家办公系统(有论文)
基于Springboot的疫情居家办公系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及i…...
HarmonyOS鸿蒙开发组件状态管理详细说明
组件状态管理 一、State State用于装饰当前组件的状态变量,State装饰的变量在发生变化时,会驱动当前组件的视图刷新,语法如下: State count:number 1; 需要注意的是:State装饰的变量必须进行本地初始化。 允许装…...
【剑指offer】顺时针打印矩阵
题目链接 acwing leetcode 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 数据范围矩阵中元素数量 [0,400]。 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出:[1,2,3,4,8,12,11,10,9,5,6,7] 解题 …...
推特社交机器人分类
机器人有不同的种类。 cresci-17数据集中的三种不同的机器人类:传统垃圾机器人、社交垃圾机器人和假追随者。 传统的垃圾邮件机器人会生成大量推广产品的内容,并且可以通过频繁使用的形容词来检测; 社交垃圾邮件倾向于攻击或支持政治候选人,因此情绪是一…...
openGauss增量备份恢复
openGauss 增量备份恢复 openGauss 数据库自 2020 年 6 月 30 日发布以来,很多小伙伴都提到“openGauss 数据库是否有增量备份工具?“这么一个问题。 在 openGauss 1.0.0 版本的时候,关于这个问题的回答往往是:“Sorry…”&…...
Idea与DataGrip各版本通用破解码,无需脚本。
直接输入即可。若失效,访问网址http://idea521.com/即可获取新的破解码。亲测好用。 Idea与DataGrip是一个公司的产品,这里的破解码可通用。 破解码一: 375XQD8EO2-eyJsaWNlbnNlSWQiOiIzNzVYUUQ4RU8yIiwibGljZW5zZWVOYW1lIjoi5YWo5a625qG2IHd…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
