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

article/2025/9/29 5:28:01

项目开发中,性能是我们比较关注的问题,特别是数据库的性能;作为一个开发,经常和SQL语句打交道,想要写出合格的SQL语句,我们需要了解SQL语句在数据库中是如何扫描表、如何使用索引的;

MySQL提供explain/desc命令输出执行计划,我们通过执行计划优化SQL语句。

下面我们以MySQL5.7为例了解一下执行计划:

注:文中涉及到的表结构、sql语句只是为了理解explain/desc执行计划,有不合理之处勿喷

explain/desc 用法

只需要在我们的查询语句前加 explain/desc即可

准备数据表

1 --创建user表

2 create table user(3 id int,4 name varchar(20),5 role_id int,6 primary key(id)7 )engine=innodb default charset=utf8;8 --创建role表

9 create tablerole(10 id int,11 name varchar(20),12 primary key(id)13 )engine=innodb default charset=utf8;

查询,执行计划

1 explain select * from user;

11ea57bca755606a4427104ec35b9375.png

执行计划输出有id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、extra,这些内容有什么意义,下面简单介绍一下

explain/desc 输出详解

一、id ,select 查询序列号

1 id相同,从上往下一次执行;

1 --左关联

2 explain select * from user a left join user b on a.id=b.id;3 --右关联

4 explain select * from user a right join user b on a.id=b.id;

1808fa90bde37b8ce92cf44201a8f0da.png

通过left join 和 right join 验证;id一样(注意执行计划的table列),left join 先扫描a表,再扫描b表;right join 先扫描b表,再扫描a表

2 id不同,id越大优先级越高,越先被执行

1 desc select * from user where role_id=(select id from role where name='开发');

9cf15158f7e66c8924ab5edb7bb0e52f.png

我们编写查询角色为开发的用户;可以知道先查询角色name为开发角色id,查询序列号为2;再根据角色id查询用户,查询序列号为1;

二、select_type,查询语句类型

(1) SIMPLE(简单SELECT,不使用UNION或子查询等)

1 explain select * from user;

11ea57bca755606a4427104ec35b9375.png

(2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

1 desc select * from user where role_id=(select id from role where name='开发');

9cf15158f7e66c8924ab5edb7bb0e52f.png

(3) UNION(UNION中的第二个或后面的SELECT语句)

1 desc select * from user where name='Java' union select * from user where role_id=1;

00576a524e492838c7f5b58ddf134799.png

(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)

1 desc select * from usera2 where id in(3 select b.id from user b where b.id=a.id union

4 select c.id from role c where c.id=a.role_id5 );

2fadfdd1950142780b7e250000f6a96a.png

(5) UNION RESULT(UNION的结果)

1 desc select * from user where name='Java' union select * from user where role_id=1;

3217ad14b2942637b84eeec3a1094ca5.png

(6) SUBQUERY(子查询中的第一个SELECT)

1 desc select * from user where role_id=(select id from role where name='开发');

9cf15158f7e66c8924ab5edb7bb0e52f.png

(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)

1 desc select * from user where role_id = ( select id from role where id=user.id );

eba34c4df3e0abf2875685fb893988ce.png

(8) DERIVED(派生/衍生表的SELECT, FROM子句的子查询)

1 desc select * from ( select * from user where name='Java' union select * from user where role_id=1 ) a;


http://chatgpt.dhexx.cn/article/CMaw4SJV.shtml

相关文章

Oracle查询执行计划

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

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

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

执行计划绑定方法

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

PostgreSQL执行计划

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

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

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

执行计划

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

matlab画图基本命令

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

MATLAB常用绘图命令

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

MATLAB画图命令zz

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

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里最基本的命令,帮助那些没有学过matlab,只是用它来画画图的人。

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里最基本的命令,帮助那些没有学过matlab,只是用它来画画图的人。

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

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

matlab绘图命令

1、fplot() 该命令常用来绘制符号函数的图像;其具体格式为: fplot(fun,lims),其中fun是符号函数表达式,lims用来声明绘图区间。 例如: 绘制函数:f(x)sinxx; >> lims[-5,5]>> fplot(sin(x)x,lim…

matlab绘图命令总结(重要!!!整理)

基本的绘图流程: (1)数据准备。 (2)设置当前绘图区。 (3)绘图。 (4)设置图形中曲线和标记点格式。 (5)设置坐标轴和网格线属性。 (6&a…

MATLAB常用画图命令汇总

自己在建模时常用到的绘图命令,总结的时候也实操了一下,发现了很多通往新世界的大门 我不生产文章,我只是帮助中心的搬运工~​ (一)二维图像 1.散点图 scatter() ​scatter(x,y,sz,c,mkr.filled,) sz:指…

Prometheus完整搭建及实战各种监控

一.Prometheus介绍 Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会(…

Prometheus【普罗米修斯】+Grafana部署企业级监控之 promQL语法

一、PromQL介绍 PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化以及rules 告警中都会使用到它。 1.1 表达式数据类型: 在prometheus的表达…

Granafa监控仪表盘:自定义简约型-只显示资源总览,各个主机详情

目录 前言 Grafana选择监控仪表盘 自定义简约型-只显示资源总览,各个主机详情 监控仪表盘JSON数据 前言 相关参考:Windows监控:基于PrometheusGrafana监控CPU、内存、磁盘、网络、GPU信息 Grafana选择监控仪表盘 访问地址:htt…