EXPLAIN的用法

news2024/11/16 13:56:21
一、语法
EXPLAIN + SQL语句
二、各字段解释

1、table

 ● 单表:显示这一行的数据是关于哪张表的。

● 多表关联:t1为驱动表,t2为被驱动表。

注意: 内连接时,MySQL性能优化器会自动判断哪个表是驱动表,哪个表示被驱动表,和书写的顺序无关。

2、id

表示查询中执行select子句或操作表的顺序。
● id相同:执行顺序由上至下

● id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

注意: 查询优化器可能对涉及子查询的语句进行优化, 转为连接查询

● id为NULL:最后执行

小结:
● id如果相同,可以认为是一组,从上往下顺序执行
● 在所有组中,id值越大,优先级越高,越先执行
● 关注点:id号每个号码,表示一趟独立的查询, 一个sql的查询趟数越少越好

3、select_type

查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

● SIMPLE:简单查询。查询中不包含子查询或者UNION。

● PRIMARY:主查询。查询中若包含子查询,则最外层查询被标记为PRIMARY。
● SUBQUERY:子查询。在SELECT或WHERE列表中包含了子查询。

● DEPENDENT SUBQUREY:如果包含了子查询,并且查询语句不能被优化器转换为连接查询,并且子查询是 相关子查询(子查询基于外部数据列) ,则子查询就是DEPENDENT SUBQUREY。

● UNCACHEABLE SUBQUREY:表示这个subquery的查询要受到外部系统变量的影响。

● UNION:对于包含UNION或者UNION ALL的查询语句,除了最左边的查询是PRIMARY,其余的查询都是UNION。
● UNION RESULT:UNION会对查询结果进行查询去重,MYSQL会使用临时表来完成UNION查询的去重工作,针对这个临时表的查询就是"UNION RESULT"。

● DEPENDENT UNION:子查询中的UNION或者UNION ALL,除了最左边的查询是DEPENDENT SUBQUREY,其余的查询都是DEPENDENT UNION。

● DERIVED:在包含 派生表(子查询在from子句中) 的查询中,MySQL会递归执行这些子查询,把结果放在临时表里。

这里的 <derived2> 就是在id为2的查询中产生的派生表。

MySQL在处理带有派生表的语句时,优先尝试把派生表和外层查询进行合并,如果不行,再把派
生表 物化掉(执行子查询,并把结果放入临时表) ,然后执行查询。

下面的例子就是就是将派生表和外层查询进行合并的例子:

● MATERIALIZED:优化器对于包含子查询的语句, 如果选择将子查询物化后再与外层查询连接查询 ,该子查询的类型就是MATERIALIZED。如下的例子中,查询优化器先将子查询转换成物化表,然后将t1和物化表进行连接查询。

4、type

结果值从最好到最坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery
> index_subquery >  range > index > ALL
比较重要的包含:system >const >eq_ref >ref >range > index > ALL
SQL 性能优化的目标:至少要达到  range 级别,要求是  ref 级别,最好是  consts 级别。(阿里巴巴开发手册要求)

● ALL:全表扫描。Full Table Scan,将遍历全表以找到匹配的行

● index:当使用 覆盖索引 ,但需要扫描全部的索引记录时。
覆盖索引: 如果能通过读取索引就可以得到想要的数据,那就不需要读取用户记录,或者不用再做回表操作了。一个索引包含了满足查询结果的数据就叫做覆盖索引。

-- 只需要读取聚簇索引部分的非叶子节点,就可以得到id的值,不需要查询叶子节点。

-- 只需要读取二级索引,就可以在二级索引中获取到想要的数据,不需要再根据叶子节点中的id做回表操作。

● range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。

● ref:通过普通二级索引列与常量进行等值匹配时。

● eq_ref:连接查询时通过主键或不允许NULL值的唯一二级索引列进行等值匹配时。

● const:根据 主键 或者 唯一二级索引 列与 常数 进行匹配时。

● system:MyISAM引擎中,当表中只有一条记录时。 (这是所有type的值中性能最高的场景)。

5、possible_keys 

possible_keys 表示执行查询时可能用到的索引,一个或多个。 查询涉及到的字段上若存在索
引,则该索引将被列出,但不一定被查询实际使用。

6、keys

keys 表示实际使用的索引。如果为NULL,则没有使用索引。

7、key_len 

表示索引使用的字节数,根据这个值可以判断索引的使用情况, 检查是否充分利用了索引,针对联合索引值越大越好。

如何计算:
1. 先看索引上字段的类型+长度。比如:int=4 ; varchar(20) =20 ; char(20) =20
2. 如果是varchar或者char这种字符串字段,视字符集要乘不同的值,比如utf8要乘 3,如果是
utf8mb4要乘4,GBK要乘2
3. varchar这种动态字符串要加2个字节
4. 允许为空的字段要加1个字节

8、ref

显示与key中的索引进行比较的列或常量。

9、rows 

MySQL认为它执行查询时必须检查的行数。值越小越好。

10、filtered

最后查询出来的数据占所有服务器端检查行数(rows)的 百分比 。值越大越好。

11、Extra 

包含不适合在其他列中显示但十分重要的额外信息。通过这些额外信息来 理解MySQL到底将如何执行当前的查询语句 。MySQL提供的额外信息有好几十个,这里只挑介绍比较重要的介绍。

● Impossible WHERE:where子句的值总是false

● Using where:使用了where,但在where上有字段没有创建索引

● Using temporary:使了用临时表保存中间结果

● Using filesort:
在对查询结果中的记录进行排序时,是可以使用索引的,如下所示:

如果排序操作无法使用到索引,只能在内存中(记录较少时)或者磁盘中(记录较多时)进行排序
(filesort),如下所示:

● Using index:使用了覆盖索引,表示直接访问索引就足够获取到所需要的数据,不需要通过索引
回表

● Using index condition:叫作 Index Condition Pushdown Optimization (索引下推优化)

        ♦如果没有索引下推(ICP) ,那么MySQL在存储引擎层找到满足 content1 > 'z' 条件的第一条二级索引记录。 主键值进行回表 ,返回完整的记录给server层,server层再判断其他的搜索条件是否成立。如果成立则保留该记录,否则跳过该记录,然后向存储引擎层要下一条记录。
        ♦如果使用了索引下推(ICP ),那么MySQL在存储引擎层找到满足 content1 > 'z' 条件的第一条二级索引记录。 不着急执行回表 ,而是在这条记录上先判断一下所有关于 idx_content1索引中包含的条件是否成立,也就是 content1 > 'z' AND content1 LIKE '%a' 是否成立。如果这些条件不成立,则直接跳过该二级索引记录,去找下一条二级索引记录;如果这些条件成立,则执行回表操作,返回完整的记录给server层。

如果这里的查询条件 只有content1 > 'z' ,那么找到满足条件的索引后也会进行一次索引下推
的操作,判断content1 > 'z'是否成立(这是源码中为了编程方便做的冗余判断)

● Using join buffer:在连接查询时,当被驱动表不能有效的利用索引时,MySQL会为其分配一块
名为连接缓冲区(join buffer)的内存来加快查询速度

测试数据
CREATE TABLE t1(id INT(10) AUTO_INCREMENT, content VARCHAR(100) NULL, PRIMARY
KEY (id));
CREATE TABLE t2(id INT(10) AUTO_INCREMENT, content VARCHAR(100) NULL, PRIMARY
KEY (id));
CREATE TABLE t3(id INT(10) AUTO_INCREMENT, content VARCHAR(100) NULL, PRIMARY
KEY (id));
CREATE TABLE t4(id INT(10) AUTO_INCREMENT, content1 VARCHAR(100) NULL, content2
VARCHAR(100) NULL, PRIMARY KEY (id));
CREATE INDEX idx_content1 ON t4(content1);  -- 普通索引
# 以下新增sql多执行几次,以便演示
INSERT INTO t1(content) VALUES(CONCAT('t1_',FLOOR(1+RAND()*1000)));
INSERT INTO t2(content) VALUES(CONCAT('t2_',FLOOR(1+RAND()*1000)));
INSERT INTO t3(content) VALUES(CONCAT('t3_',FLOOR(1+RAND()*1000)));
INSERT INTO t4(content1, content2) VALUES(CONCAT('t4_',FLOOR(1+RAND()*1000)),
CONCAT('t4_',FLOOR(1+RAND()*1000)));

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是HTTPS协议?与HTTP协议区别?

一、协议科普 HTTP协议&#xff08;超文本传输协议&#xff09;是一种用于在计算机网络上传输超文本的应用层协议。它是一种客户端-服务器协议&#xff0c;允许客户端通过Web浏览器等方式向服务器发送请求&#xff0c;服务器则返回响应。HTTP协议是构建万维网&#xff08;WWW&…

使用pip命令安装库,装到其他环境中的问题。

问题描述&#xff1a;我们在pycharm中创建了新的虚拟环境&#xff0c;但是在其终端使用Pip命令安装库时&#xff0c;发现库却安装到了其他conda创建的环境中。图示安装gym库&#xff0c;刚开始安装到了其他地方&#xff0c;第二次正确安装。 原因分析&#xff1a;安装库时&…

USB fastboot

1 Samsung fastboot flashing unlock 2 bootloader增加解锁密码 diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c index e4d46e4..1b4b450 100755 --- a/app/aboot/aboot.c b/app/aboot/aboot.c -2613,6 2613,20 void cmd_oem_unlock(const char *arg, void *data,…

[ES]mac安装es、kibana、ik分词器

一、安装es和kibana 1、创建一个网络&#xff0c;网络内的框架(eskibana)互联 docker network create es-net 2、下载es和kibana docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1 3、运行docker命令部署单点eskibana&#xff08;用来操作es&#xff09; doc…

分布式搜索引擎

1 DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一…

开启智能时代:深度解析智能文档分析技术的前沿与应用

开启智能时代&#xff1a;深度解析智能文档分析技术的前沿与应用 本章主要介绍文档分析技术的理论知识&#xff0c;包括背景介绍、算法分类和对应思路。通过本文学习&#xff0c;你可以掌握&#xff1a;1. 版面分析的分类和典型思想 2. 表格识别的分类和典型思想 3. 信息提取的…

C语言函数编程指南:实现模块化和可维护的代码

函数 1. 前言2. 函数是什么3. C语言中函数的分类3.1 库函数3.2 自定义函数 4. 函数的参数4.1 实际参数&#xff08;实参&#xff09;4.2 形式参数&#xff08;形参&#xff09; 5. 函数的调用5.1 传值调用5.2 传址调用 6. 阶段练习6.1 打印100~200之间的素数6.2 打印1000到2000…

WEBGL(2):绘制单个点

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

基于微信小程序的社交用户交流系统

本文从管理员、用户的功能要求出发&#xff0c;微信小程序的社交系统中的功能模块主要是实现首页、个人中心、用户管理、用户技能管理、技能分类管理、交流论坛、系统管理。经过认真细致的研究&#xff0c;精心准备和规划&#xff0c;最后测试成功&#xff0c;系统可以正常使用…

RFID技术:工业稳定的关键

RFID 技术在工业领域的应用让生产和运营更加稳定高效。这种无线通信技术可以通过无线电波实现信息的读取和写入&#xff0c;使得数据采集、存储和传输变得更加便捷。在工业生产中&#xff0c;RFID 的应用可以帮助企业提高生产效率、降低成本、提高产品质量&#xff0c;从而让工…

Mike11;Mike21深度技能解析

数学模型在水环境评价、防洪评价和排污口论证等领域中有重要作用&#xff0c;随着人类活动的不断增加和环境问题的日益突出&#xff0c;对水资源和水环境的保护与管理变得至关重要。为了更好地理解和应对这些挑战&#xff0c;数学模型成为一种强大的工具&#xff0c;能够提供量…

<Cadence> PCB封装制作(一) 封装组成元素介绍制作表贴焊盘

目录 01 封装的组成元素 02 焊盘Design Layers组成 03 制作表贴焊盘 获取表贴器件&#xff08;0603电阻&#xff09;的相关信息 制作表贴器件&#xff08;0603电阻&#xff09;焊盘封装 04 文章总结 大家好&#xff0c;这里是程序员杰克。一名平平无奇的嵌入式软件工程师…

【100天精通python】Day49:python web编程_web框架,Flask的使用

目录 1 Web 框架 2 python 中常用的web框架 3 Flask 框架的使用 3.1 Flask框架安装 3.2 第一个Flask程序 3.3 路由 3.3.1 基本路由 3.3.2 动态路由 3.3.3 HTTP 方法 3.3.4 多个路由绑定到一个视图函数 3.3.5 访问URL 参数的路由 3.3.6 带默认值的动态路由 3.3.7 带…

Cell | 超深度宏基因组!复原消失的肠道微生物

期刊&#xff1a;Cell IF&#xff1a;64.5 (Q1) 发表时间&#xff1a;2023.6 研究背景 不同的生活方式会影响微生物组组成&#xff0c;但目前微生物组的研究严重偏向于西方工业化人群&#xff0c;其中工业化人群的特点是微生物群多样性较低。为了理解工…

Kubernetes技术--k8s核心技术 configMap

1.概述 configMap最主要的作用是存储一些不加密的数据到/etcd,让pod以变量或者数据卷(volume)挂载到容器。 应用场景:配置文件、存储信息等 2.使用 -1.创建配置文件。 这里我们需要先编写一个配置文件。使用redis,如下所示:

普洛斯常熟东南数据中心获LEED金级认证及IDCC绿色算力基础设施奖

近日&#xff0c;普洛斯常熟东南数据中心获得美国绿色建筑评估标准体系LEED v4 BDC&#xff08;建筑设计与建造&#xff09;金级认证&#xff0c;并获评IDCC2023长三角区域绿色算力基础设施奖。以可持续发展理念为核心&#xff0c;该数据中心从设计规划、开发建设&#xff0c;到…

WebGL Varing变量的作用和内插过程,及执行Varing时涉及的图形装配、光栅化、颜色插值、片元着色器执行机制等详解

目录 前言 在 WebGL 或 OpenGL 中&#xff0c;“varying” 是一种用于在顶点着色器和片元着色器之间传递数据的特殊类型的变量。它允许在顶点着色器对数据进行处理后&#xff0c;在片元着色器中使用该处理后的数据进行进一步计算。 彩色三个点 ​编辑 彩色三个点示例代码…

Ant-Design-Pro-V5: ProTable前端导出excel表格。

Prtable表格中根据搜索条件实现excel表格导出。 代码展示&#xff1a; index.jsx import React, { useRef, useState, Fragment, useEffect } from react; import { getLecturerList, lecturerExportExcel } from /services/train/personnel; import { getOrgList, getSelec…

打击儿童性虐待,遭多家机构反对,苹果宣布停止开发CSAM检测计划

据报道&#xff0c;苹果公司曾计划在其iCloud云服务中引入一项儿童性虐待资料&#xff08;CSAM&#xff09;检测计划&#xff0c;但由于反对声浪日益高涨&#xff0c;该计划最终宣布停止开发。CSAM检测计划的原本目的是为了帮助阻止儿童性虐待资料的传播&#xff0c;保护儿童的…

实例418 通过串口发送数据

实例说明 现在大多数硬件设备均采用串口技术与计算机相连&#xff0c;因此串口的应用程序开发越来越普遍。例如&#xff0c;在计算机没有安装网卡的情况下&#xff0c;将本机上的一些信息数据传输到另一台计算机上&#xff0c;那么利用串口通信就可以实现。运行本程序&#xff…