【实践篇】MySQL执行计划详解
文章目录
- 本文知识大纲速览
- 1. 前言
- 2. 基本介绍
- 1. 什么是执行计划
- 2. 如何查看执行计划
- 3. 执行计划的组成部分
- 3. 执行计划的关键元素
- 1. id
- 2. select_type
- 3. table:
- 4. type:
- 5. possible_keys:
- 6. key:
- 7. key_len
- 8. ref:
- 9. rows:
- 10. Extra
- 4. 底层原理
- 5. 执行计划示例解读
- 本文知识图谱
- 1. MySQL执行计划
- 2. 查询执行计划信息
- 3 执行计划的关键元素
- 4. 底层原理
本文知识大纲速览
1. 前言
MySQL执行计划是MySQL提供的一种查看SQL与数据库交互行为的工具。可以很直观的帮助开发者发现问题并进行SQL优化。最常用的是EXPLAIN
命令。
使用EXPLAIN
关键字可以模拟优化器的行为,返回MySQL如何使用索引进行搜索和表的连接顺序(JOIN;),并且可以让我们知道在MySQL解析我们的查询时,每个动作后的信息。
查询执行计划信息包含:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以被用到
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
当我们使用EXPLAIN
开头,对查询做分析预测后,解析的结果能告诉我们:
- 哪些部分或者说哪个环节消耗的时间多
- 哪些索引被使用,哪些没有被使用上
- 查询与表的行数和读取方式
- 总之,就是看待查询各项操作的代价如何
要理解和解释执行计划,就需要了解它包含的一些关键信息,并可以对其进行适当的优化。例如,在合适的地方建立索引,改变JOIN顺序,重写查询等,都可以改善查询的效率。
2. 基本介绍
1. 什么是执行计划
执行计划是MySQL数据库在执行SQL查询时的一个操作步骤集合。它描述了数据库如何执行SQL语句,以及如何从数据表中检索或更新数据。执行计划包括了多种信息,如数据读取的顺序,数据过滤的方式,连接表的方式等。
2. 如何查看执行计划
在MySQL中,可以通过在查询语句前面添加"EXPLAIN"关键字来查看该查询的执行计划。例如:
EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
这将会返回一个表,其中包含了执行计划的详细信息。
3. 执行计划的组成部分
- id:查询的序列号,表示查询的执行顺序。
- select_type:查询的类型,例如:SIMPLE(简单查询),PRIMARY(主查询),SUBQUERY(子查询)等。
- table:输出结果集的表。
- type:连接类型,表示MySQL在表中找到所需行的方式,常见的类型有:ALL(全表扫描),index(全索引扫描),range(范围扫描)等。
- possible_keys:可能应用的索引。
- key:实际应用的索引,如果为NULL,则没有使用索引。
- key_len:表示索引字段的长度,如果为NULL,则表示不使用索引。
- ref:显示关键字的比较,是常数还是字段等。
- rows:根据表统计信息及索引选用情况,大致估算出查找所需读取的行数。
- Extra:包含MySQL解决查询的详细信息,如:Using index(使用了覆盖索引),Using where(使用了WHERE过滤器)等。
3. 执行计划的关键元素
1. id
这是查询的标识符,代表查询的组执行顺序。相同的id说明在同一执行阶段。
2. select_type
这个列标明查询的类型。常见的查询类型有SIMPLE(简单查询,不包含子查询或者UNION操作), PRIMARY(主查询,外层查询), SUBQUERY(子查询,在SELECT或者WHERE列表中)等。
3. table:
输出结果集的表。对于多表查询,会显示访问每个表的顺序。
4. type:
这是表示MySQL如何对表的行进行遍历的类型。各种类型从最好到最坏分别是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。
5. possible_keys:
显示可能用于查询的索引。它并不代表这个索引一定会被使用。
6. key:
实际使用的索引。如果为NULL,则没有使用索引。
7. key_len
表示索引字段的长度,如果为NULL,则表示不使用索引。
8. ref:
显示使用哪个列或常量与key列进行比较。
9. rows:
估计MySQL需要读取的行数来执行查询。
10. Extra
提供了关于MySQL如何解析查询及查询是否使用索引等信息。
常见的值有Using where, Using temporary, Using filesort等。这些都是MySQL优化器在生成查询执行计划时的一些策略说明:
-
Using where:表示MySQL服务器将在存储引擎检索行后再进行过滤,这说明查询中有一个WHERE子句,并且存储引擎不会自动过滤这些行。
-
Using temporary:表示MySQL需要使用一个临时表来存储结果集,这通常发生在对不同列的多次排序时。
-
Using filesort:表示MySQL需要进行额外的步骤来找出如何检索行,因为它不能仅通过索引来完成。这通常出现在ORDER BY或GROUP BY查询中,当无法使用索引顺序来完成排序时,会进行额外的排序步骤。
这些策略都可能对查询性能产生影响。例如,"Using temporary"和"Using filesort"都可能会导致查询速度变
慢,尤其是在处理大量数据时。
-
Using index:表示使用了覆盖索引(Covering Index),即所有需要的数据都被直接从索引中读取,而无需从数据表中读取。使用覆盖索引可以大大提高查询性能。
-
Using join buffer:表示使用了连接缓冲,这是MySQL优化连接操作的一种方式,可以提高连接多张表的效率。
-
Using sort union:表示使用排序合并算法进行OR操作,该算法可以在不同的索引之间进行排序和合并操作。
-
Using index condition:表示使用了索引条件推送(Index Condition Pushdown),即将部分WHERE子句条件在存储引擎层进行计算,避免了不必要的行扫描和传输。
MySQL查询优化器常见的一些策略。这些策略并非越多越好,而是根据具体查询和数据表结构来选择最适合的策略。优化器的目标是尽可能减少查询处理所需的磁盘I/O和CPU时间。
4. 底层原理
MySQL的执行计划基于查询优化器,它的主要任务是找到执行SQL查询的最优方式。优化器会考虑各种可能的执行计划,比如使用哪个索引,以何种顺序连接表,等等,然后根据估算的成本选择一个最优的执行计划。
当你执行一个SQL查询时,MySQL首先会解析这个查询,检查语法是否正确,然后生成一个对应的内部数据结构,我们称之为解析树。接着,优化器会使用各种规则和启发式方法,对解析树进行优化,生成一个或多个可能的执行计划。每个执行计划都对应一个可能的查询执行路径,包括使用哪个索引,以何种顺序连接表,等等。
然后,优化器会对每个执行计划进行成本估算,这个成本主要基于读取数据的数量,也就是IO操作的数量。此外,优化器还会考虑CPU消耗,内存消耗等因素。
最后,优化器会选择成本最低的执行计划来执行这个查询。执行计划中的每个步骤都会被转换为一系列的底层操作,比如读取磁盘上的数据,执行计算,等等,这些操作最终由MySQL的存储引擎来执行。
当你使用EXPLAIN命令查看执行计划时,你看到的就是优化器生成的这个最优执行计划的详细信息。
5. 执行计划示例解读
以下是一个复杂的SQL查询示例
SELECT p.product_name, c.category_name, s.supplier_name, SUM(od.quantity) as total_quantity
FROM products p
INNER JOIN categories c ON p.category_id = c.category_id
INNER JOIN suppliers s ON p.supplier_id = s.supplier_id
INNER JOIN order_details od ON p.product_id = od.product_id
GROUP BY p.product_name, c.category_name, s.supplier_name
HAVING total_quantity > 100
ORDER BY total_quantity DESC;
这个查询涉及到多个表的连接,并使用了聚合函数和分组操作。查询的目标是获取每个产品的名称、所属类别、供应商名称以及总销量,并按照销量进行降序排序。
它包含了多个表的连接操作和聚合函数的使用。通过INNER JOIN语句将四个表(products, categories, suppliers, order_details)连接起来,使用ON子句指定连接的条件。然后通过GROUP BY子句对产品名称、类别名称和供应商名称进行分组,使用SUM函数计算每个组别的总销量。最后,在HAVING子句中对总销量进行筛选,只返回销量大于100的数据。最后,使用ORDER BY子句对总销量进行降序排序。
这个复杂的查询可以用于分析产品销售情况,找出销量最高的产品,并了解它们所属的类别和供应商。
EXPLAIN
的输出可能如下
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 1000 | Using temporary; Using filesort |
1 | SIMPLE | c | ref | PRIMARY | PRIMARY | 4 | db.p.category_id | 1 | NULL |
1 | SIMPLE | s | eq_ref | PRIMARY | PRIMARY | 4 | db.p.supplier_id | 1 | NULL |
1 | SIMPLE | od | ref | p2 | prod_id | 4 | db.p.product_id | 10 | Using Where |
- 所有四个表
products,categories,suppliers,order_details
都参与了查询(操作1代表简单查询没有UNION或子查询)。 - 表
p(products)
要对行进行全表扫描(类型为ALL),结果集预计的行数为1000,并且需要额外的操作(temporary和filesort)用来处理GROUP BY
和ORDER BY
。 - 表
c (categories)
和s (suppliers)
均是使用了ref查找方式对应索引PRIMARY
,意味着它们确认supplier_id
和category_id
是作为索引存在的,并且每一个可供该基表使用的联接列都参与了索引查找,在联接时每找出一行。 - 表
od (order_details)
使用了索引prod_id
,该操作与提供的prod_id匹配行,并在对结果进行执行,并过滤掉结果中未满足WHERE子句条件的记录。
这个计划告诉我们,这个查询可能的优化:可能要考虑为产量表
products
添加以product_id作为主键的索引,用于减少全表扫描的影响。
本文知识图谱
1. MySQL执行计划
- 用途:查看SQL与数据库交互行为的工具
- 命令:EXPLAIN
2. 查询执行计划信息
- 表的读取顺序
- 数据读取操作的操作类型
- 可用的索引与实际使用的索引
- 表之间的引用
- 优化器查询的行数
3 执行计划的关键元素
- id:查询的执行顺序
- select_type:查询的类型
- table:输出结果集的表
- type:MySQL在表中找到所需行的方式
- possible_keys:可能应用的索引
- key:实际应用的索引
- key_len:索引字段的长度
- ref:关键字的比较
- rows:查找所需读取的行数
- Extra:MySQL解决查询的详细信息
4. 底层原理
- 基于查询优化器
- 优化器任务:找到执行SQL查询的最优方式
- 执行计划:优化器生成的最优执行计划的详细信息
相关文章:
【实践篇】MySQL执行计划详解
文章目录 本文知识大纲速览1. 前言2. 基本介绍1. 什么是执行计划2. 如何查看执行计划3. 执行计划的组成部分 3. 执行计划的关键元素1. id2. select_type3. table:4. type:5. possible_keys:6. key:7. key_len8. ref:9. rows:10. Extra 4. 底层原理5. 执行计划示例解读本文知识图…...
二维凸包(Graham) 模板 + 详解
(闲话) 上了大学后没怎么搞oi,从土木跑路到通信了(提桶开润大成功!),但是一年上两年的课(补的),保研也寄掉了( 说起来自从博客被大学同学发现并…...
ElasticSearch(ES)简单介绍
ES简介 Elasticsearch(通常简称为ES)是一个开源的分布式搜索和分析引擎,旨在处理各种类型的数据,包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的,但随着时间的推移,它已经演变成一个功能…...
OpenCV(三十五):凸包检测
1.凸包检测介绍 凸包检测是计算凸包的一种技术,凸包就是:给定二维平面上的点集,将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。 2.凸包检测函数convexHull() void cv::convexHull ( InputArray points, OutputArra…...
PS 透视裁剪工具
上文 PS 裁剪工具及工具栏配置讲解 我们讲完了裁剪工具 然后 我们继续来研究 透视裁剪工具 切换到 透视裁剪工具 后 我们先点击左上方的清除 先不要这些多的配置 然后 我们可以先用鼠标在图像上 画出一个局域 然后 我们去拖他四个角中的其中一个 就能拖出一些不同的形状 然…...
每日一个C库函数-#1-memset()
每日一个C库函数-#1-memset() 来源 C 标准库 - <string.h> 声明 void *memset(void *str, int c, size_t n);str:要填充的内存块;c:要被设置的值(以何值填充)。该值以 int 形式传递,填充内存块时…...
GraphQL基础知识与Spring for GraphQL使用教程
文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…...
【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析
【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…...
威胁的数量、复杂程度和扩散程度不断上升
Integrity360 宣布了针对所面临的网络安全威胁、数量以及事件响应挑战的独立研究结果。 数据盗窃、网络钓鱼、勒索软件和 APT 是最令人担忧的问题 这项调查于 2023 年 8 月 9 日至 14 日期间对 205 名 IT 安全决策者进行了调查,强调了他们的主要网络安全威胁和担忧…...
NSSCTF web 刷题记录2
文章目录 前言题目[广东强网杯 2021 团队组]love_Pokemon[NCTF 2018]Easy_Audit[安洵杯 2019]easy_web[NCTF 2018]全球最大交友网站prize_p2[羊城杯 2020]easyser[FBCTF 2019]rceservice方法一方法二 前言 今天是2023年9月13号,刷题记录2正式开始。时间来到九月十七…...
Linux驱动之INPUT子系统框架
目录 一、input 子系统简介 二、input 驱动编写流程 1、注册 input_dev 2、上报输入事件 三、input_event 结构体 按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设…...
Long类型雪花算法ID返回前端后三位精度缺失问题解决
目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述 Java 后端使用雪花算法生成 Long 类型的主键 ID࿰…...
6.8-SpringIoC之循环依赖底层源码解析
解决靠,三级缓存 创建Map,存不完整的Bean 存在问题:属性存在但没有值...
Springboot 实践(18)Nacos配置中心参数自动刷新测试
前文讲解了Nacos 2.2.3配置中心的服务端的下载安装,和springboot整合nacos的客户端。Springboot整合nacos关键在于使用的jar版本要匹配,文中使用版本如下: ☆ springboot版本: 2.1.5.RELEASE ☆ spring cloud版本 Greenwich.RELEASE ☆ sp…...
uniapp引入小程序原生插件
怎么在uniapp中使用微信小程序原生插件,以收钱吧支付插件为例 1、在manifest.json里的mp-weixin中增加插件配置 "mp-weixin" : {"appid" : "你的小程序appid","setting" : {"urlCheck" : false},"usingCom…...
自己记录微信小程序开发遇到的问题
在HBuilder X中【运行】--【小程序】--【运行设置】,小程序运行配置,将【微信开发者工具】的安装路径配置进去,首次运行会自动让你填写; 1、hbuildx运行到微信开发者工具报错 Error: Unbalanced delimiter found in string 错误…...
【leetcode 力扣刷题】栈—波兰式///逆波兰式相关知识和题目
波兰式、逆波兰式相关知识和题目 波兰式、逆波兰式介绍常规表达式转换成逆波兰式编程让常规表达式转换成逆波兰式逆波兰式运算过程常规表达式转换成波兰式编程让常规表达式转换成波兰式波兰式运算过程 150. 逆波兰式表达式求值224. 基本计算器227. 基本计算器Ⅱ282. 给表达式添…...
Web 第一步:HTTP 协议(基础)
这里是JavaWeb的开头部分!那么先解释一下吧: Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 JavaWeb:是用Java技术来解决相关 Web 互联网领域的技术栈。 …...
【Vue】快速入门案例与工作流程的讲解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Vue快速入门》。…...
LuatOS-SOC接口文档(air780E)--camera - codec - 多媒体-编解码
常量 常量 类型 解释 codec.MP3 number MP3格式 codec.WAV number WAV格式 codec.AMR number AMR-NB格式,一般意义上的AMR codec.AMR_WB number AMR-WB格式 codec.create(type, isDecoder) 创建编解码用的codec 参数 传入值类型 解释 int 多媒…...
《动手学深度学习 Pytorch版》 6.6 卷积神经网络
import torch from torch import nn from d2l import torch as d2l6.6.1 LeNet LetNet-5 由两个部分组成: - 卷积编码器:由两个卷积核组成。 - 全连接层稠密块:由三个全连接层组成。模型结构如下流程图(每个卷积块由一个卷积层、…...
【微信小程序】项目初始化
| var() CSS 函数可以插入一个自定义属性(有时也被称为“CSS 变量”)的值,用来代替非自定义 属性中值的任何部分。 1.初始化样式与颜色 view,text{box-sizing: border-box; } page{--themColor:#ad905c;--globalColor:#18191b;--focusColor…...
C#,《小白学程序》第二十六课:大数乘法(BigInteger Multiply)的Toom-Cook 3算法及源程序
凑数的,仅供参考。 1 文本格式 /// <summary> /// 《小白学程序》第二十六课:大数(BigInteger)的Toom-Cook 3乘法 /// Toom-Cook 3-Way Multiplication /// </summary> /// <param name"a"></par…...
destoon自定义一个archiver内容文档
在archiver目录建立以下代码: <?php define(DT_REWRITE, true); require ../common.inc.php; $EXT[archiver_enable] or dheader(DT_PATH); //$DT_BOT or dheader(DT_PATH); $N $M $T array(); $mid or $mid 5; $vmid $list 0; foreach($MODULE as $k>…...
5-1 Dataset和DataLoader
Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。 Dataset定义了数据集的内容,它相当于一个类似列表的数据结构,具有确定的长度,能够用索引获取数据集中的元素。 而DataLoader定义了按batch加载数据集的方法,它是…...
IDEA创建完Maven工程后,右下角一直显示正在下载Maven插件
原因: 这是由于新建的Maven工程,IDEA会用它内置的默认的Maven版本,使用国外的网站下载Maven所需的插件,速度很慢 。 解决方式: 每次创建 Project 后都需要设置 Maven 家目录位置(就是我们自己下载的Mav…...
最新清理删除Mac电脑内存空间方法教程
Mac电脑使用的时间越久,系统的运行就会变的越卡顿,这是Mac os会出现的正常现象,卡顿的原因主要是系统缓存文件占用了较多的磁盘空间,或者Mac的内存空间已满。如果你的Mac运行速度变慢,很有可能是因为磁盘内存被过度占用…...
【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录
机器环境: Ubuntu 22.04.3 LTS 报错问题 在编译一个项目时出现了一段SQL报错: CGImysql/sql_connection_pool.cpp:1:10: fatal error: mysql/mysql.h: 没有那个文件或目录 1 | #include <mysql/mysql.h> | ^~~~~~~~~~~~~~~ c…...
腾讯mini项目-【指标监控服务重构】2023-08-12
今日已办 Watermill Handler 将 4 个阶段的逻辑处理定义为 Handler 测试发现,添加的 handler 会被覆盖掉,故考虑添加为 middleware 且 4 个阶段的处理逻辑针对不同 topic 是相同的。 参考https://watermill.io/docs/messages-router/实现不同topic&am…...
kubeadm部署k8sv1.24使用cri-docker做为CRI
目的 测试使用cri-docker做为containerd和docker的中间层垫片。 规划 IP系统主机名10.0.6.5ubuntu 22.04.3 jammymaster01.kktb.org10.0.6.6ubuntu 22.04.3 jammymaster02.kktb.org10.0.6.7ubuntu 22.04.3 jammymaster03.kktb.org 配置 步骤: 系统优化 禁用sw…...
wordpress获取文章内容过滤空格/网站seo技术教程
转 http://www.programbbs.com/doc/175.htm 首先申明:我是菜鸟,我只不过想把困绕了我很长时间的问题的解决方案发表出来,免得以后我又忘记,同时给还不知道这些小知识的同僚一些帮助。各位不要笑我的浅薄。同时为了表示我的低级,我会很罗嗦的讲一些基本的…...
赛迪建设网站/推广赚钱平台
十年内可以攻破癌症、糖尿病治愈难题?随着现代医疗技术和信息技术的融合发展,精准医疗的时代已经到来,这为许多特大疾病的治疗提供了新方向。这一领域也引来了国际巨头的关注。近日,英特尔在京推出了“英特尔精准医疗伙伴计划&…...
网站制作公司新鸿儒/排行榜
dagger 注入Dagger是基于Guice的开源依赖项注入(DI)框架。 但是,Dagger的开发人员对Guice的基本原理并不满意:他们一次又一次地不得不在较大的项目中编写代码,其中涉及大量的绑定代码。 由于这是静态语义的一部分&…...
常州免费做网站/长沙网站关键词排名
转自:未知的瞬间陈肃致力于企业级数据集成平台的研发。曾就职于中国移动研究院(用户行为实验室负责人)、亿瑞互动科技有限公司(技术VP)。对消息中间件、推荐系统等领域都有丰富的实践经验。拥有十项发明专利。批量和流…...
平台优化是指什么/windows优化大师功能
我的环境:MySQL:mysql-5.6.24-win32 jdbc驱动:mysql-connector-java-5.1.22-bin.jar JMeter:apache-jmeter-2.13 1、在 测试计划 中导入jdbc驱动 2、创建一个线程组,默认即可。如果业务需求可自行设置 3、创建一个jdbc…...
在美国做网站如何接入收款工具/软文范例大全800字
ESXi Server上的虚拟机分布于不同的Datastores,现有的服务器能够很好的按照如下的方式进行:每个Datastore运行一个Image,这个程序就是实现这样一个功能!因为是在现有框架增加一些功能,所以这个小程序并没有那么的合理&…...