MySQL执行计划全面解析

执行计划

如果不知道执行计划,那就不可能进行SQL优化,那么执行计划是什么呢?

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL的,进而分析性能瓶颈

用起来其实很简单,使用explain + sql语句即可,也可以与show WARNINGS来进行组合

explain select * from user;

-- show WARNINGS又是受可以解释为什么索引没有使用
explain select * from user;
show WARNINGS;

重点是如何分析结果

| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |

这写就是所打印出来的字段,接下里就一个个地分析一下是什么意思

id字段

表示的含义:select查询的序号,表示查询中执行select子句或者操作表的顺序

id值数字越大越先执行

id有三种情况

第一种情况:id相同
id相同
id相同

id相同的情况下,是按照table的顺序从上到下开始操作的

第二种情况:id不同
id不同
id不同

id不同的情况下,id越大优先级越高,id大的先被执行

第三种情况:id相同和不同
id相同不同
id相同不同

先执行id大的,id相同的顺序执行

select_type字段

该字段来表示查询类型,用于区分普通查询、联合查询、子查询等复杂查询常用的有六种

  • SIMPLE 简单查询,不包含子查询和union联合查询
  • PRIMARY 如果包含子查询,该类型表示 最外层查询
  • SUBQUERY 如果包含子查询,该类型表示在select或where中的子查询
  • DERIVED 如果在from列表中包含了子查询会被标记为DERIVED,mysql会递归执行这些子查询,并将结果放在临时表中
  • UNION 联合查询如果用来关联两个或多个select的话为从第二个SELECT开始的后面所有的select为UNION,如果UNION包含在from子句中,则外层select为DERIVED
  • DEPENDENT UNION 子查询中的UNION,且UNION中从第二个SELECT开始的后面所有的select,依赖了外部查询的结果集
  • UNION RESULT UNION中的合并结果

table字段

显示数据是哪张表的;如果显示为尖括号括起来的 就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生;如果是尖括号括起来的<union M,N>,与 类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集

partitions字段

匹配记录的分区,对于未分区的表,显示null

type字段

检索的类型

从最好到最差依次为

system>const>eq_ref>ref>range>index>ALL

至少要达到range级别,最好能是ref

  • system 表中只有一行数据,属于const的特例,该类型可忽略不计

  • const 使用主键查询或者unique索引的等值查询,只匹配一条数据,可以认为const是最优的

    explain select * from plan where id = 127
    执行计划之const
    执行计划之const
  • eq_ref 出现在连接查询中,使用唯一索引或者主键作为连接条件,唯一性索引扫描,对于每个索引键,表中只有一条与之匹配(如使用主键或者unique索引)

    explain select * from inventory, plan where plan.id = inventory.plan_id
    执行计划之eq_ref
    执行计划之eq_ref
  • ref 如果是在表连接查询中,使用索引字段作为连接条件;非唯一性索引扫描,匹配返回某个单独值得所有行

    explain select * from rule where plan_id = 127
    执行计划之ref
    执行计划之ref
  • range 检索指定范围的数据,使用索引来进行匹配,where语句中使用between...and、in、<、>等

    explain select * from rule where plan_id > 127
    执行计划之range
    执行计划之range
  • index full index scan,全索引扫描,与all相比,index只遍历索引树;当查询是索引覆盖的,extra中有using index;以索引顺序从索引中查找数据行的全表扫描,extra中没有using index;如果extra中同时有using index和using where,则是利用索引查找键值的意思

    explain select id from rule
执行计划之index
执行计划之index
  • index_merge 索引合并

    explain select * from rule where plan_id = 5 or id = 10 
执行计划之index_merge
执行计划之index_merge
  • all 全表扫描

possible_keys字段

查询使用的条件可能涉及到多个字段,所对应的多个索引,但是实际不一定会使用到所列出来的索引

key字段

查询实际使用到的索引

key_len字段

索引中使用的字节数,在不损失精度的情况下,长度越短越好(为索引值的最大可能长度,并非索引实际长度,是根据表结构计算得出,而非数据),对于确认索引的有效性以及多列索引中用到的列的数目很重要

  • 字符串
    • char(n) n字节长度
    • varchar(n)
--  char()、varchar()索引长度计算公式
(Character Set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列长度 + 1(允许null) + 2(变长列)
  • 数值类型

    • tinyint 1字节
    • smallint 2字节
    • int 4字节
    • bigint 8字节

    如果字段允许为null,需要1字节记录是否为null

  • 时间类型

    • date 3字节
    • timestamp 4字节
    • datetime 8字节

    如果字段允许为null,需要1字节记录是否为null

ref字段

显示在key列记录的索引中,表查找值所用到的列或常量,常见的有const(常量)、字段名

rows字段

估算出找到需要的数据需要读取的行数

filtered字段

表示符合查询条件的数据百分比,最大100,使用rows*filtered%可以获得和下一张表进行连接的行数

extra字段

表示一些额外信息

  • using filesort 文件排序,mysql无法利用索引来完成的排序,则使用文件排序(出现此种情况,最好进行优化)

    filesort可以使用的内容排序空间大小为sort_buffer_size,默认2M,当不够用时,会使用临时文件来存储,使用临时文件存储会进行文件的合并

    show GLOBAL status like 'Sort_merge_passes'查看merge次数,如果次数过大,建议增大sort_buffer_size

  • using temporary 使用了临时表保存中间结果,常见于排序和分组查询(出现此种情况,尽快优化,速度极慢),使用group by分组查询时,最好按照索引顺序来进行分组

    临时表可能是在内存/磁盘上创建的,内存临时表最大容量为tmp_table_sizemax_heap_table_size的最小值,大于该值时会使用磁盘临时表

    show GLOBAL status like '%tmp%'查看

    +-------------------------+---------+
    | Variable_name           | Value   |
    +-------------------------+---------+
    | Created_tmp_disk_tables | 4025    |
    | Created_tmp_files       | 6366    |
    | Created_tmp_tables      | 2096332 |
    +-------------------------+---------+

    Created_tmp_disk_tables表示创建的磁盘临时表的总数

    Created_tmp_tables表示创建临时表的总数

  • using index 表示相应的select行使用了覆盖索引(覆盖索引为查询结果为索引列,不必读取数据行),防止访问数据行,速度提升。如果同时出现了Using where,表示索引也被用来执行查询动作

  • using where 不是读取表中的所有数据或者除了索引之外还使用了其他非索引列,使用where条件进行过滤

  • using join buffer 在使用join进行链表查询的时候,如果表的连接条件没有用到索引,需要有一个缓冲区来存储中间结果,需要添加索引进行优化

  • impossible where where条件总是false,无法查到数据

    https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/5.执行计划/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/336442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swin版VMamba来了!精度再度提升,VMamba-S达成83.5%,超越Swin-S,已开源!

本文首发&#xff1a;AIWalker 就在昨日&#xff0c;华科王兴刚团队公开了Mamba在ViT的入局Vim&#xff0c;取得了更高精度、更快速度、更低显存占用。相关信息可参考&#xff1a; 入局CV&#xff0c;Mamba再显神威&#xff01;华科王兴刚团队首次将Mamba引入ViT&#xff0c;更…

Java 内存模型深度解析

优质博文&#xff1a;IT-BLOG-CN 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题&#xff1a;线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中&#xff0c;线程之间的通信机制有两种&#xff1a;内存共享和消息传递&…

Redis 存在线程安全问题吗?为什么?

一个工作了 5 年的粉丝私信我。 他说自己准备了半年时间&#xff0c;想如蚂蚁金服&#xff0c;结果第一面就挂了&#xff0c;非常难过。 问题是&#xff1a; “Redis 存在线程安全问题吗&#xff1f;” 一、问题解析 关于这个问题&#xff0c;我从两个方面来回答。 第一个&a…

ChatGPT 到 Word:使用 Writage 进行复制粘贴魔法

ChatGPT 到 Word&#xff1a;使用 Writage 进行复制粘贴魔法 写在前面Writage的使用 写在前面 随着ChatGPT的日益普及&#xff0c;越来越多的人每天依赖它来完成各种任务。无论是寻找信息、语言翻译、解决数学问题&#xff0c;还是精炼复杂的概念和文本&#xff0c;ChatGPT 都…

AWS CI/CD之二:配置CodeDeploy

问题 前面一篇文章介绍了CodeBuild中构建一个Java的Maven项目。在这个基础上面&#xff0c;我们继续AWS CI/CD工作流构建之路。 1.配置CodePipeline简配版 这里主要是利用CodePipeline配置之前的CodeBuild项目&#xff0c;以便生产出需要部署的jar文件和CodeDeploy需要用到相…

【rust/bevy】使用points构造ConvexMesh

目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统&#xff1a;win11rust版本&#xff1a;rustc 1.77.0-nightlybevy版本&#xff1a;0.12 问题提出 在three.js中&#xff0c;可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hull) import { ConvexGeo…

【c++】——栈or队列or优先级队列

目录 &#x1f393;容器适配器 &#x1f393;Stack栈 &#x1f6a9;Stack的介绍 &#x1f6a9;Stack的基本使用 &#x1f6a9;Stack底层实现 &#x1f393;queue队列 &#x1f6a9;queue的介绍 &#x1f6a9;queue的基本使用 &#x1f6a9;queue的底层实现 &#x1…

爬虫之牛刀小试(八):爬取微博评论

今天爬取的是微博评论。 可以发现其特点是下一页评论的max_id在上一页中。 于是代码如下&#xff1a; import requests import json import re import time headers {User-Agent: ,"Cookie": "","Referer": "https://m.weibo.cn/detail/4…

Kafka-消费者-KafkaConsumer分析-PartitionAssignor

Leader消费者在收到JoinGroupResponse后&#xff0c;会按照其中指定的分区分配策略进行分区分配&#xff0c;每个分区分配策略就是一个PartitionAssignor接口的实现。图是PartitionAssignor的继承结构及其中的组件。 PartitionAssignor接口中定义了Assignment和Subscription两个…

网络安全全栈培训笔记(54-服务攻防-数据库安全RedisHadoopMysqla未授权访问RCE)

第54天 服务攻防-数据库安全&Redis&Hadoop&Mysqla&未授权访问&RCE 知识点&#xff1a; 1、服务攻防数据库类型安全 2、Redis&Hadoop&Mysql安全 3、Mysql-CVE-2012-2122漏洞 4、Hadoop-配置不当未授权三重奏&RCE漏洞 3、Redis-配置不当未授权…

Laya3.0 相机使用

摄像机&#xff0c;是3D场景里边最经常使用的对象了。 官方文档&#xff1a;点击这里学习 1.投影 Projection 透视&#xff1a; 模拟人眼的视觉效果&#xff0c;近大远小。模拟物理世界的规律&#xff0c;将眼睛或相机抽象成一个点&#xff0c;此时视锥体内的物体投影到视平…

51单片机独立按键

独立按键介绍 在嵌入式系统中&#xff0c;独立按键通常指的是单独的按键开关或按钮&#xff0c;它们通常用于接收用户输入或执行特定的功能。在51单片机&#xff08;指的是Intel 8051或其兼容芯片&#xff09;中&#xff0c;独立按键可以通过简单的硬件连接和软件编程来实现各种…

Grafana(三)Grafana 免密登录-隐藏导航栏-主题变换

一. 免密登录 Grafana 的常用方式&#xff1a; 将配置好的Grafana图嵌入到系统页面中 为了实现可免登录访问&#xff0c;可以通过如下方式进行设置&#xff1a; 1. 修改Grafana配置文件 在Grafana的配置文件 /etc/grafana/grafana.ini 中&#xff0c;找到 [auth.anonymous] 配…

网络编辑day4

思维导图 广播模型发送端-->类似于UDP客户端 #include<head.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error ");return -1;}//2、将套接字设置成允许广播int broadcast1…

【SpringCloud】微服务框架后端部署详细过程记录20240119

前言&#xff1a;前两天公司接到客户提供的一个微服务框架&#xff0c;导师让我在本地部署验证一下该框架的可用性&#xff0c;借此机会记录一下微服务项目的一个基本部署流程&#xff0c;仅供学习参考&#xff0c;如有不足还请指正&#xff01; 文件结构 提供的压缩文件共包含…

【lettuce-排行榜】

背景&#xff1a; 这次游戏中台采用lettuce的zset完成游戏内的本服和跨服排行榜&#xff0c;因此写一下案例。 pom.xml <dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.4.RELEASE</ve…

Android14之DefaultKeyedVector实现(一百八十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

python之粘包/粘包的解决方案

python之粘包/粘包的解决方案 什么是粘包 粘包就是在数据传输过程中有多个数据包被粘连在一起被发送或接受 服务端&#xff1a; import socket import struct# 创建Socket Socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定服务器和端口号 servers_addr (…

LeetCode 热题 100 | 双指针(上)

目录 1 283. 移动零 2 11. 盛最多水的容器 3 15. 三数之和 菜鸟做题第一周&#xff0c;语言是 C 1 283. 移动零 解题思路&#xff1a; 两个指针一前一后遍历数组前者永远指向 0&#xff0c;后者永远在寻找非 0 数的路上后者找到一个非 0 数就和前者进行一个数值交换 …

Python爬虫从入门到入狱系列合集

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…