mysql执行计划explain

news/2024/7/24 2:06:53 标签: mysql, 数据库, 数学建模

mysql__0">mysql 执行计划

explain 介绍

  • mysql8.0为例:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

EXPLAIN为语句中使用的每个表返回一行信息 SELECT。它按照 MySQL 在处理语句时读取它们的顺序列出输出中的表。这意味着 MySQL 从第一个表中读取一行,然后在第二个表中找到匹配的行,然后在第三个表中,依此类推。当所有的表都被处理完后,MySQL 将选择的列输出,并在表列表中回溯,直到找到一个有更多匹配行的表。从此表中读取下一行,然后继续处理下一个表

创建两个表(student、scope)

  • 创建表
create table student
(
    student_id bigint auto_increment comment '学生id'
        primary key,
    name       varchar(20) null comment '学生姓名',
    age        int         null comment '年龄'
)
    comment '学生表';


create table score
(
    score_id   bigint auto_increment comment '分数id'
        primary key,
    student_id bigint        not null comment '学生id',
    subject    varchar(20)   null comment '科目',
    score      decimal(5, 2) null comment '分数'
)
    comment '学生成绩表';
  • 添加索引
create index idx_student_id
    on score (student_id);
create index idx_subject
    on score (subject);
  • 初始化数据
insert into md_test.student (student_id, name, age)
values  (1, '小明', 18),
        (2, '张三', 19),
        (3, '李四', 19),
        (4, '王二', 17),
        (5, '孙悟空', 17),
        (6, '猪八戒', 20);

insert into md_test.score (score_id, student_id, subject, score)
values  (1, 1, '语文', 90.00),
        (2, 1, '数学', 98.00),
        (3, 2, '语文', 97.00),
        (4, 2, '数学', 87.00),
        (5, 3, '语文', 78.00),
        (6, 3, '数学', 88.00),
        (7, 4, '语文', 99.00),
        (8, 4, '数学', 100.00),
        (9, 5, '语文', 96.00),
        (10, 5, '数学', 78.00),
        (11, 6, '语文', 87.00),
        (12, 6, '数学', 88.00);

explain 输出列

  • 使用explain查询sql执行计划
explain
select * from student;
  • 对应执行计划
    在这里插入图片描述
id
  • 标识符SELECT。SELECT这是查询中的序号 。NULL如果该行引用其他行的并集结果,则该值可以是。在这种情况下,该 table列显示一个值 like 表示该行引用具有值 和 的行的并集
select_type
  • simple
    简单查询不包含子查询和union,如果查询中有任何复杂的子部分,则最外层部分标记为PRIMARY
explain
select * from student limit 1;

在这里插入图片描述

  • PRIMARY
    最外层的select
explain
select (select st.name from student st where st.student_id = sc.student_id) as student_name, sc.score
from score sc;

在这里插入图片描述

  • SUBQUERY SELECT子查询中的第一个
  • DEPENDENT SUBQUERY 首先SELECT在子查询中,依赖于外部查询
explain
select (select st.name from student st where st.student_id = sc.student_id) as student_name, sc.score
from score sc;

在这里插入图片描述

  • UNION SELECT中的 第二个或后面的语句UNION
  • UNION RESULT 表示用来从UNION的匿名临时表检索结果的select
explain
select * from student s1 where s1.student_id=1
union
select * from student s2 where s2.student_id=4;

在这里插入图片描述

  • derived 派生表(临时表)
table
  • 输出行所引用的表的名称。这也可以是以下值之一
    <unionM,N>: 当有 union 时,UNION RESULT 的 table 列的值为 <unionM,N>。 MN
    :该行引用值为 的行的派生表id结果 N。例如,派生表可能来自子句中的子查询 FROM。
    id :该行引用值为 的行的具体化子查询的结果N
partitions
type
  • 查询将匹配记录的分区
  • 查询效率依次从最优到最差分别为
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • const 该表最多有一个匹配行,在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。 const表非常快,因为它们只读一次。
  • system 该表只有一行(=系统表)。这是连接类型的一个特例 const。
explain
select *
from student s1
where s1.student_id = 1;

在这里插入图片描述

  • eq_ref
    primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录
    除了 systemand const类型,这是最好的连接类型
explain
select (select st.name from student st where st.student_id = sc.student_id) as student_name, sc.score
from (select * from score s where s.score > 80) sc;

在这里插入图片描述

  • ref
    相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行
explain
select * from score sc where sc.student_id=3;

在这里插入图片描述

  • ref_or_null
    这种连接类型类似于 ref,但 MySQL 对包含值的行进行了额外的搜索NULL。这种连接类型优化最常用于解析子查询

  • index_merge
    此连接类型表示使用索引合并优化

  • range
    仅检索给定范围内的行,使用索引来选择行。key 输出行中的列指示使用了哪个索引。包含key_len使用过的最长的密钥部分。该ref列 NULL适用于此类型。

range=可以在使用, <>, >, >=, , <, <=, IS NULL, <=>, BETWEEN, LIKE或 运算符将键列与常量进行比较时使用 IN()

explain
select *
from student
where student_id>2 and student_id<6;

在这里插入图片描述

  • index
    连接index类型与 相同 ALL,只是扫描了索引树
possible_keys
  1. 这一列显示查询可能使用哪些索引来查找
  2. 如果此列是NULL,则没有相关索引
  3. 要查看表有哪些索引,请使用. show index from table_name
    在这里插入图片描述
key
  1. 该key列表示 MySQL 实际决定使用的键(索引)
  2. 如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index
key_len

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列

ref

该ref列显示将哪些列或常量与列中指定的索引进行比较 key以从表中选择行

rows

该rows列表示查询扫描的行数
对于InnoDB表格,此数字是一个估计值,可能并不总是准确的

Extra

查询的附加信息

  • distinct
    一旦mysql找到了与行相联合匹配的行,就不再搜索了

  • Using index
    select语句中使用覆盖索引,以避免回表查询(当查询仅使用属于单个索引的列时,可以使用此策略)

explain
select student_id
from student
where student_id=2;

在这里插入图片描述

  • Using where
    使用了where过滤
explain
select *
from student
where student_id>2;

在这里插入图片描述

  • Using filesort
  • Using index condition

http://www.niftyadmin.cn/n/358180.html

相关文章

万字长文详述ClickHouse在京喜达实时数据的探索与实践 | 京东云技术团队

1 前言 京喜达技术部在社区团购场景下采用JDQFlinkElasticsearch架构来打造实时数据报表。随着业务的发展 Elasticsearch开始暴露出一些弊端&#xff0c;不适合大批量的数据查询&#xff0c;高频次深度分页导出导致ES宕机、不能精确去重统计&#xff0c;多个字段聚合计算时性能…

CANopenNode Master 配置

文章目录 CANopenNode 简介CANopenNode 主栈SDO ClientPDO 通讯参数RPDO 通讯参数RPDO 通信参数设置实例TPDO 通讯参数TPDO 通信参数设置实例 PDO 映射参数RPDO 映射参数设置实例TPDO 映射参数设置实例 CANopenNode 简介 CANopenNode 是一个开源的免费的开源 CANopen 协议栈。…

【运维知识进阶篇】集群架构-Nginx高可用Keepalived

高可用是指2台机器启动着完全相同的业务系统&#xff0c;一台机器宕机后&#xff0c;另一台可以快速启用&#xff0c;用户是无感知的。高可用硬件通常使用F5&#xff0c;软件通常使用keepalived。keepalived软件是基于VRRP协议实现的&#xff0c;VRRP虚拟路由冗余协议&#xff…

CMS 8bit单片机C语言编写指南

0 Preface/Foreword 单片机包含两部分&#xff1a;程序内存&#xff08;Program memory space&#xff09;和数据存储器(Ram memory space)。 CMS单片机堆栈深度受限&#xff0c;随具体的芯片而固定。 1 CMS C程序框架及数据类型 1.1 源程序基本框架 Example: 1.2 CMS C中变…

Ubuntu TDengine集群搭建

我这里用三台服务器搭建集群 1、如果搭建集群的物理节点上之前安装过TDengine先卸载清空&#xff0c;直接执行以下4条命令 rmtaos rm -rf /var/lib/taos rm -rf /var/log/taos rm -rf /etc/taos2、确保集群中所有主机开放端口 6030-6043/tcp&#xff0c;6060/tcp&#xff0c;…

八股总结(六):Android基础:四大组件与UI控件

文章目录 四大组件基本概念Activityzygote是什么&#xff1f;有什么作用&#xff1f;SystemServer是什么&#xff1f;有什么用&#xff0c;与zygote的关系是什么&#xff1f;为什么称为服务端对象&#xff1f;APP、AMS、zygote是三个独立的进程&#xff0c;他们之间如何通信呢&…

error while loading shared libraries: libc.so.6 误删除libc.so.6急救办法,

故障原因&#xff1a; 在高版本的环境中编译了一个软件&#xff0c;然而在低版本系统中无法使用&#xff0c;缺少libc.so支持,然而在编译过程中误删除了 libc.so.6的软连接&#xff0c;rm /lib64/libc.so.6 删除后发现系统好多命令都无法使用了&#xff0c;悲催&#xff01…

Python中的全局变量与局部变量

1 定义 全局变量指的是在整个python文件中定义的变量&#xff0c;而局部变量是在函数内部定义的变量。 a 1 def yang_func():b 2 从以上代码中可以看出&#xff0c;变量a是全局变量&#xff0c;变量b是定义在yang_func()函数的内部&#xff0c;因此b是局部变量。 2 使用范…