Mysql Explain工具介绍

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈。

准备表

-- 课程表
CREATE TABLE `class` (
 `id` int(11) NOT NULL,
 `name` varchar(45) DEFAULT NULL,
 `update_time` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `class` (`id`, `name`) VALUES (1,'a'), (2,'b'), (3,'c');



-- 学生表
CREATE TABLE `student` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  INSERT INTO `student` (`id`, `name`) VALUES (3,'java1'),(1,'java2'),(2,'java3');

 
 -- 成绩单
 CREATE TABLE `student_score` (
 `id` int(11) NOT NULL,
 `student_id` int(11) NOT NULL,
 `class_id` int(11) NOT NULL,
 `score` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_class_id` (`student_id`,`class_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 INSERT INTO `student_score` (`id`, `student_id`, `class_id`,`score`) VALUES (1,1,1,60),(2,1,2,70),(3,2,1,80);

EXPLAIN使用方式

在sql语句前加上explain 指令。

explain  select * from `class` where id = 1

结果输出展示:

结果解读

id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。

id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

select_type列

select_type 表示对应行是简单还是复杂的查询。

table列

表示当前这一行正在访问哪张表,如果SQL定义了别名,则展示表的别名

type列

表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。

依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL

一般来说,得保证查询达到range级别,最好达到ref

system

system是const的特例,表里只有一条元组匹配时为system

const

针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可

explain  select * from `class` where id = 1;
eq_ref

当使用了索引的全部组成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才会使用该类型,最多只会返回一条符合条件的记录。性能仅次于system及const。

explain select * from student_score s left join student on s.student_id = student.id;

ref

当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。如果使用的索引只会匹配到少量的行,性能也是不错的。

explain select * from student where name = 'java';

#使用idx_class_id 索引一部分 
explain select student_id from student s left join student_score c on s.id = c.student_id;
range

范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描。比较常见的范围扫描是带有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。

index

扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。

  • 有两种场景会触发:

    • 如果索引是查询的覆盖索引,并且索引查询的数据就可以满足查询中所需的所有数据,则只扫描索引树。此时,explain的Extra 列的结果是Using index。index通常比ALL快,因为索引的大小通常小于表数据。
    • 按索引的顺序来查找数据行,执行了全表扫描。此时,explain的Extra列的结果不会出现Uses index。
ALL

全表扫描,性能最差,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。

possible_keys列

这一列显示查询可能使用哪些索引来查找。

explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。

key列

实际采用哪个索引来优化对该表的访问。

如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

key_len列

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

key_len计算规则如下:

字符串,char(n)和varchar(n),5.0.3以后版本中,**n均代表字符数,而不是字节数,**如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节

char(n):如果存汉字长度就是 3n 字节

varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为

varchar是变长字符串数值类型

tinyint:1字节

smallint:2字节

int:4字节

bigint:8字节

时间类型

date:3字节timestamp:4字节

datetime:8字节

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

索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索

引。

ref列

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

rows列

mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

Extra列

这一列展示的是额外信息。

**Using index:**使用覆盖索引

Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖

Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;先按条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行。

explain select * from student_score where student_id > 1;

Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

explain select DISTINCT name from class ;

此时会出现Using temporary,如果在name字段上加了索引,就会变成Using index

Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。

 explain select * from class order by name;

Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段

 explain select min(id) from class ;

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

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

相关文章

linux创建用户并设置sudo权限,主机将相互免密

1.创建用户组 2.创建用户 3.登陆主机查看用户情况 3.1查看create_user.yaml内容 3.2字段说明&#xff1a; Ansible的user模块提供了一系列参数&#xff0c;使你能够定义用户账户的各种属性&#xff0c;例如用户名、密码、主目录、用户组等。下面是一些常用的参数&#xff1a; …

dolphinscheduler

架构说明 MasterServer MasterServer采用分布式无中心设计理念&#xff0c;MasterServer主要负责 DAG 任务切分、任务提交监控&#xff0c;并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点&#xff0c;通过监听Zookeep…

数据结构-链表的简单操作代码实现2【Java版】

目录 写在前&#xff1a; 此篇讲解关于单链表的一些面试题目&#xff0c;续上节。 11.反转一个单链表 12.给定一个带有头结点的head的非空单链表&#xff0c;返回链表的中间结点&#xff0c;如果有两个中间结点&#xff0c;则返回第二个中间结点 13.输入一个链表&#xff0c…

什么是流程图,流程图怎么画?实名推荐这3个好用的在线流程图软件!

流程图是表达工作流程或者系统操作过程的有效工具&#xff0c;被广泛应用于各个行业和领域。他们以视觉的形式将复杂的流程简化&#xff0c;便于理解、交流和优化。不论是计划新项目、审计工作流程&#xff0c;还是改进现有操作&#xff0c;流程图都是一个不可或缺的工具。 什…

Mysql-表的结构操作

1.创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字…

人工智能与多平台自动引流应用的结合

人工智能的技术在多平台自动引流方面的应用非常广泛&#xff0c;下面举例说明&#xff1a; 智能推荐算法&#xff1a;人工智能的推荐算法能够根据用户的兴趣和行为数据&#xff0c;自动向其推荐相关的内容和产品&#xff0c;从而引导用户访问和购买。这种多平台自动引流的方式可…

UITableView的style是UITableViewStyleGrouped

一般情况下&#xff0c;UITableViewStylePlain和UITableViewStyleGrouped是UITableView常用到的style&#xff0c; 之前都是用到的时候&#xff0c;遇到问题直接用度娘&#xff0c;差不多就够用了&#xff0c;今天在修复UI提出的间隙问题&#xff0c;来回改&#xff0c;总觉得…

Clickhouse 学习笔记(7)—— 查看执行计划

在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能 可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看 在20.6版本之后可以通过explain语句查看执行计划 基本语法 EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [se…

OpenAtom OpenHarmony三方库创建发布及安全隐私检测

OpenAtom OpenHarmony三方库&#xff08;以下简称“三方库”或“包”&#xff09;&#xff0c;是经过验证可在OpenHarmony系统上可重复使用的软件组件&#xff0c;可帮助开发者快速开发OpenHarmony应用。三方库根据其开发语言分为2种&#xff0c;一种是使用JavaScript和TypeScr…

phono3py快速安装教程

phono3py是类似于Phonopy的另一款基于第一性原理计算获得材料声学性质并可后处理的功能强大的软件&#xff0c;在以往推送内容中也有介绍基于phono3py 计算晶格热导率VASPphono3py:快速计算晶格热导率 和声子寿命理论到实践&#xff1a;VASPPhono3py计算Phonon Lifetime 以及…

速锐得HJ1239车载终端TBOX柴油商用车远程排放管理工况模型应用

其实排放模型&#xff0c;并不是生涩难懂的问题&#xff0c;首先我们准备好一台TBOX&#xff0c;比如无论是海康、华为、速锐得、博世、联电、LG、西门子都可以做到&#xff0c;在满足TBOX具备4G物联网2路CAN支持远程升级控车&#xff0c;支持国四国五国六车型&#xff0c;带定…

Python实现猎人猎物优化算法(HPO)优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

前后端交互案例,图书管理系统

先引入前端代码运行看看是否有问题 图书管理系统 定义前后端交互接口 1.登录 URL : /user/login 参数 : userName?&password? 响应 : true/false 2.图书列表展示 : URL : /book/getBookList 参数 : 无 响应 : List<BookInfo> 后端代码如下: package com…

飞天使-django概念之urls

urls 容易搞混的概念&#xff0c;域名&#xff0c;主机名&#xff0c;路由 网站模块多主机应用 不同模块解析不同的服务器ip地址 网页模块多路径应用 urlpatterns [ path(‘admin/’, admin.site.urls), path(‘’, app01views.index), path(‘movie/’, app01views.movi…

完整版Java电子病历EMR编辑器系统源码

电子病历&#xff08;EMR&#xff09;是提供给医院机构内部使用&#xff0c;利用电子计算机保存、管理、传输和重现数字化的病人的医疗记录&#xff0c;在此基础上充分考虑患者信息的保密性&#xff0c;提高医疗质量和医治效率等服务功能的计算机信息系统。 一、电子病历编辑器…

成都爱尔周进院长解析高度近视可能引发哪些疾病

当代各类人群面对电脑、手机屏幕的时长显著增加&#xff0c;导致用眼过度、疲劳&#xff0c;视觉质量下降&#xff0c;近视人群越来越多。而当父母有一方为高度近视甚至可能将近视遗传给孩子。 目前&#xff0c;全球近视人数约25亿&#xff0c;中国近视人群人数多达6亿。据预测…

美国BGP服务器有哪些优势?

​  在当今数字化时代&#xff0c;网络连接的性能和可靠性对于企业和个人来说至关重要。而美国作为全球互联网的中心之一&#xff0c;其地区BGP服务器拥有许多优势。  网络性能和可靠性&#xff1a;美国BGP专线服务器采用BGP协议&#xff0c;一种高级动态路由协议&#xff…

幼师一旦开窍,工作真的没有这么难

真心希望所有新手幼教老师都能知道啊 只有输入关键词和要求&#xff0c;几秒就能生成一篇教案&#xff0c;从教学目标到教学内容都能给你安排的妥妥的。而且可以多次生成&#xff0c;每次生成都是不一样的内容。 什么教案、发言稿、总结、评语都能用的上啊&#xff0c;幼师姐…

计算机网络:IP 地址的编址

IP 地址的编址方式经历了三个历史阶段&#xff1a; 1. 分类的 IP 地址&#xff1b; 2. 子网的划分&#xff1b; 3. 构成超网。 1. 分类的 IP 地址 由两部分组成&#xff0c;网络号和主机号&#xff0c;其中不同类别具有不同的网络号长度&#xff0c;并且是固定的。 IP 地址 :: …

2024年武汉市中级工程师职称申报流程

很多人评审职称不知道职称申报需要走哪些步骤&#xff0c;不是很了解职称申报的一个过程&#xff0c;今天秋禾火告诉大家武汉职称申报流程是哪些&#xff0c;带你快速了解 首先是职称申报方式 职称评审目前是系统网上申报和线下送审纸质材料的双结合方式申报个人通过“湖北省…