详解mysql执行计划

article/2025/9/29 5:00:00

        在数据库查询的时候,我们通常会使用sql语句去查询自己所需要的数据。但是,关于sql在数据库中是如何执行的,它有没有使用索引,具体使用了哪些索引,查找了哪些字段和表,他们的顺序是怎样的,分别用时多少等等信息我们不得而知,那么有没有什么方法可以看到这些信息,mysql给我们提供了一套工具——执行计划。

一、什么是执行计划

        执行计划是数据库提供给我们的一套对sql语句进行解析、分析、优化功能的工具,他具有以下的作用:

  1. 展示表的读取顺序;
  2. 数据读取操作的类型;
  3. 哪些索引是可以使用的;
  4. 哪些索引是实际上使用的;
  5. 表之间的引用关系;
  6. 每张表被查询的行数。

注意:执行计划只是数据库针对sql给出最佳的优化参考方案,并不一定是最优解,即不要过度相信执行计划

二、如何使用执行计划

使用执行计划很简单,在要执行的sql前面加上关键词explain即可。

三、执行计划信息

 从图中可以看出,sql执行计划主要包含以下信息:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。

3.1、id

select查询序列号,id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行;

3.2、select_type

select_type:表示select语句的类型,可以有以下取值;

  1. SIMPLE:表示简单查询,其中不包含连接查询和⼦查询;
  2. PRIMARY: 表示主查询,或者是最外⾯的查询语句;
  3. UNION:表示连接查询的第2个或后⾯的查询语句;
  4. DEPENDENT UNION:UNION中的第⼆个或后⾯的SELECT语句,取决于外⾯的查询;
  5. UNION RESULT: 连接查询的结果;
  6. SUBQUERY:⼦查询中的第1个SELECT语句;
  7. DEPENDENT SUBQUERY:⼦查询中的第1个SELECT语句,取决于外⾯的查询;
  8. DERIVED:SELECT(FROM ⼦句的⼦查询)。

3.3、table

table:表示查询的表名,可以有以下几种情况:

  1. 显示表名,如果起了别名,则显示别名;
  2. <derivenN>:表示查询的条件是一个子查询;
  3. <union1,2>:表示表1和表2使用union。

3.4、partitions

partitions:匹配的分区。

3.5、type

type:这⼀列表示表关联类型或访问类型,即数据库决定如何查找表中的⾏,查找数据⾏记录的⼤概范围。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all

  1. system:表中只有一行记录,相当于系统表,这是const类型的特列,平时不会出现,可以忽略不计;
  2. const:通过索引一次命中,匹配一行数据,所以很快,常⽤于PRIMARY KEY或者UNIQUE索引的查询,可理解为const是最优化的;
  3. eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用语主键或唯一索引扫描,这可能是在 const 之外最好的联接类型了;
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行,用于=、<或>操作符带索引的列;
  5. range:只检索给定范围的行,使用一个索引来选择行,一般用于between、<、>、in等查询,这种范围查询要比index要好,因为他只需要扫描索引的一个点,结束于另外一个点;
  6. index:需要遍历索引树;
  7. all:即全表扫描,意味着数据库需要从头到尾去查找所需要的⾏。通常情况下这需要增加索引来进⾏优化了。

注意:在进行sql优化的时候至少要优化到range,推荐优化到ref,最好是const。

3.6、possible_keys

possible_keys:这⼀列显示查询可能使⽤哪些索引来查找。explain 时可能出现 possible_keys 有列,⽽ key 显示 NULL 的情况,这种情况是因为表中数据不多,数据库认为索引对此查询帮助不⼤,选择了全表查询。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where ⼦句看是否可以创造⼀个适当的索引来提⾼查询性能,然后⽤ explain 查看效果。

3.7、key

key:显示数据库实际决定使⽤的键(索引)。如果没有选择索引,key的值是NULL。可以强制使⽤索引或者忽略索引。

3.8、key_len

key_len:这⼀列显示了数据库在索引⾥使⽤的字节数,通过这个值可以算出具体使⽤了索引中的哪些列,数值计算如下:

字符串类型
char(n):n字节长度
varchar(n):2字节存储字符串长度,如果是utf-8,则长度 3n + 2
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节  
时间类型 
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
注意:索引最⼤⻓度是768字节,当字符串过⻓时,数据库会做⼀个类似左前缀索引的处理,将前半部分的字符提取出来做索引。

3.9、ref

ref:这⼀列显示了在key列记录的索引中表查找值所⽤到的列或常量,常见的有:const(常量),func,null,字段名(例:film.id)

3.10、rows

rows:这⼀列是数据库估计要读取并扫描的⾏数,注意这个不是结果集⾥的⾏数,因此这个值越小越好。

3.11、filtered

filtered:返回结果的行数占读取行数的百分比,值越大越好。

3.12、Extra

extra:这一列显示的是额外的信息,即不包含在其他列的信息,具体值如下:

  1. distinct:数据库发现第1个匹配⾏后,停⽌为当前的⾏组合搜索更多的⾏;
  2. not exists:数据库能够对查询进⾏LEFT JOIN优化,发现1个匹配LEFT JOIN标准的⾏后,不再为前⾯的的⾏组合在该表内检查更多的⾏;
  3. range checked for each record (index map: #):数据库没有发现好的可以使⽤的索引,但发现如果来⾃前⾯的表的列值已知,可能部分索引可以使⽤;
  4. using filesort(重点):数据库会对结果使⽤⼀个外部索引排序,⽽不是按索引次序从表⾥读取⾏。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和⾏指针,然后排序关键字并按顺序检索⾏信息。这种情况下⼀般也是要考虑使⽤索引来优化的;
  5. using index(重点):从只使⽤索引树中的信息⽽不需要进⼀步搜索读取实际的⾏来检索表中的列信息,即表示select使用了覆盖索引而不必去回表查询
  6. using temporary(重点):数据库需要创建⼀张临时表来处理查询,这种情况常见于order by和group by。出现这种情况⼀般是要进⾏优化的,⾸先是想到⽤索引来优化;
  7. using where:数据库将在存储引擎检索⾏后再进⾏过滤。就是先读取整⾏数据,再按where 条件进⾏检查,符合就留下,不符合就丢弃;
  8. using index condition:与Using where类似,查询的列不完全被索引覆盖,where条件中是⼀个前导列的范围;
  9. using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描;
  10. using index for group-by:类似于访问表的Using index⽅式,Using index for group-by表示数据库发现了⼀个索引,可以⽤来查 询group by或distinct查询的所有列,⽽不要额外搜索硬盘访问实际的表;
  11. null:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着⽤到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地⽤到了索引,也不是完全没⽤到索引,即使用了索引但需要回表操作,应该避免回表操作。

http://chatgpt.dhexx.cn/article/4N7enT9u.shtml

相关文章

Spark执行计划分析与研究

在学习、使用和研究spark的过程中&#xff0c;逐渐会发现&#xff1a;单纯看官方文档对spark参数调优只能解决一小部分的问题&#xff0c;要想进一步的学习spark&#xff0c;进一步调优甚至在spark源码的基础上二次开发&#xff0c;我觉得收益最高的应该是学习执行计划了。 因…

impala 执行计划详解

Impala是一个MPPMassivelyParallelProcessing计算引擎&#xff0c;简单来说就是将计算压力分到多个节点&#xff0c;得到结果后汇总&#xff0c;然后再返回给客户端。如果你留意过Impala的执行计划&#xff0c;会观察到exchange节点&#xff0c;该节点的作用就是分散计算压力的…

sqlserver 执行计划

一个很好的手册分享&#xff0c;执行计划里的属性解释官方文档&#xff1a;https://docs.microsoft.com/zh-cn/sql/relational-databases/showplan-logical-and-physical-operators-reference?viewsql-server-2017 想复杂的事情简单说&#xff0c;在看执行计划的其他文章的时…

MySQL执行计划

什么是执行计划 The set of operations T that the optimizer o chooses to perform the most efficient query t is called the “query execution plan”, also known as theEXPLAIN plan 如何获取SQL语句的执行计划 方法1&#xff1a; explain SQL 。方法2&#xff1a; …

sql 执行计划

一、各数据库执行计划执行方式 二、explan 三种格式 (以MySQL为例) 1.默认格式 2.tree 格式(与postgreSQL执行计划格式相似) 3.json格式 三、执行计划各字段名含义 1) id:查询编号 ,从小到大,编号越大执行顺序越往前 相同的话从上往下执行(也可以把编号当成缩进的格数…

mysql的执行计划_MySQL——执行计划

项目开发中,性能是我们比较关注的问题,特别是数据库的性能;作为一个开发,经常和SQL语句打交道,想要写出合格的SQL语句,我们需要了解SQL语句在数据库中是如何扫描表、如何使用索引的; MySQL提供explain/desc命令输出执行计划,我们通过执行计划优化SQL语句。 下面我们以M…

Oracle查询执行计划

执行计划&#xff08;Execution Plan&#xff09;也叫查询计划&#xff08;Query Plan&#xff09;&#xff0c;它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括&#xff1a; ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。 ● 多表…

oracle执行计划耗费 基数 字节,Oracle 查看执行计划

一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计…

执行计划绑定方法

执行计划突变属于每个数据库系统不可避免页难以预防的难题&#xff0c;处理执行计划突变带来的性能问题也是每个DBA应该具备的技能。除了开发时针对不同范围的结果集使用不同的sql&#xff0c;DBA可以通过查看索引状态、消除索引碎片、表重新分析&#xff0c;还可以使用执行计划…

PostgreSQL执行计划

简介 PostgreSQL是“世界上最先进的开源关系型数据库”。因为出现较晚&#xff0c;所以客户人群基数较MySQL少&#xff0c;但是发展势头很猛&#xff0c;最大优势是完全开源。 MySQL是“世界上最流行的开源关系型数据库”。当前客户基数大&#xff0c;随着被Oracle收购&#…

一文带你了解SQL的执行计划(explain)

一. 什么是SQL执行计划 为什么关注sql的执行计划&#xff0c;因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。 通过一个sql计划&#xff0c;如何访问中的数据 &#xff08;是使用全表扫描还是索引查找&#xff1f;&#xff09; 一个表中可能存在多个表中不同的…

执行计划

一、什么是执行计划&#xff08;explain plan&#xff09; 执行计划&#xff1a;一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信…

matlab画图基本命令

一、本文主要内容和相关参考博客 参考了xticklabel和xtick在matlab里的区别 和 label ‘ytick’的设置这两个网址。matlab在画图时会自动调整坐标轴间隔的大小&#xff0c;但是我们可以使用如set(gca,ytick,ylabel_pos,yticklabel,ylabel_str)的函数来实现自己调整间隔以画出…

MATLAB常用绘图命令

选择图型窗口命令 坐标轴相关命令 文字标示命令 栅格 离散数据处理

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

slice matlab,Matlab画图之slice命令

满意答案 7a6o8yb4 2015.08.12 采纳率:55% 等级:8 已帮助:212人 close all; clc; clear; A = [1 2 2 25 1 3 3 21 1 4 4 20 2 5 5 19 2 6 7 31]; x = A(:, 1); y = A(:, 2); z = A(:, 3); s = A(:, 4); % 提取有效数据 xb = min(x); xe = max(x); yb = min(y); ye = max(…

Matlab画图命令介绍

这是matlab里最基本的命令&#xff0c;帮助那些没有学过matlab&#xff0c;只是用它来画画图的人。

matlab画图句柄

Hf_1figure(color, white);figure全部属性 Alphamap: [0 0.0159 0.0317 0.0476 0.0635 0.0794 … ]BeingDeleted: offBusyAction: queueButtonDownFcn: Children: [00 GraphicsPlaceholder]Clipping: onCloseRequestFcn: closereqColor: [1 1 1]Colormap: [2563 double]Context…

【转载】Matlab画图命令介绍

这是matlab里最基本的命令&#xff0c;帮助那些没有学过matlab&#xff0c;只是用它来画画图的人。

matlab 画图 浓淡有别,matlab画图命令汇总

matlab画图命令汇总(2010-11-16 21:46:24) 转载 一、plot系列 plot  |  plot3  |  plotyy  |  polar(极坐标) 二、image系列 image  |  imagesc  |  pcolor(伪彩图)  | 三、contour系列——等高线图 contour  |  contour3  |  contourc  |  …