MySQL | Explain的是使用详解

explain

介绍

  1. Explain是SQL分析工具中非常重要的一个功能,可以模拟优化器执行查询语句,帮助我们理解查询是如何执行的;
  2. 分析查询执行计划可以帮助我们发现sql查询瓶颈,优化查询性能。

使用方法

  1. MySQL5.7 版本之前使用:
Explain Extended select * from user;
  1. MySQL5.7 版本开始:
Explain select * from user;
  1. 与show warnings搭配使用查看执行器优化后的sql:
Explain select * from user;
show warnings

返回详情

id

每个select都对应一个id,从1开始递增,如果该查询有子查询,将显示多个id值

id相同

执行顺序从上往下

id不同

序号大的先执行

同时存在

先执行序号大的,再从上往下

NULL

最后执行,且表示结果集,不需要使用它进行查询

select_type

SIMPLE

建单select,不包括union与子查询

PRIMARY

复杂查询中最外层查询,比如使用union和union all时,id为1的记录select_type通常是primary

SUBQUERY

指在select语句中出现的查询语句,结果不依赖于外部查询

DEPENDENT SUBQUERY

指在select语句中出现的查询语句,结果依赖于外部查询

DERIVED

派生表,在FROM子句的查询语句,标识从外部数据源中推导出来的,而不是从select语句中的其他列中选择出来的。

UNION

  1. 分union和union all两种,id大于1的select被标记为union;
  2. 如果union备from子句的子查询包含,则第一个select会备标记为derived;
  3. union会针对相同的结果集进行去重,union all不会进行去重处理;

DEPENDENT UNION

当union作为子查询时,其中第一个union为dependent subquery,第二个union为dependent union。

UNION RESULT

如果两个查询中有相同的列,则会对这些列进行重复删除,只保留一个表中的列。

UNCACHENABLE SUBQUERY

一个子查询的结果不能备缓存,而是需要每次查询时重新计算

table

查询所涉及的表名

  1. 如果有两个表,将显示多行记录。
  2. 如果有别名,展示别名。

partitions

表分区情况

type

查询访问类型

Null

MySQL在优化过程中分解语句就已经可以获取到结果,执行时甚至不用访问表或索引,效率高。

system

const类型的一种特殊场景,查询的表只有一行的情况

const

基于主键或唯一索引查看一行,当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问转换成常量查询,效率高。

eq_ref

基于主键或唯一索引连接两个表,对于每个索引键值,只有一条匹配记录

ref

基于非唯一索引连接两个表,通过二级索引列与常量进行等值匹配,可能会存在多条匹配记录。

fulltext

全文索引

ref_or_null

基于非唯一索引连接两个表,通过二级索引进行等值匹配,该索引列的值可以是NULL值。

index_merge

标识使用索引合并的优化方法,当查询需要扫描大量的数据时,使用合并索引可以提高查询效率。

unique_subquery

查询使用合并索引来执行,当查询需要过滤大量数据时,使用子查询可以避免冲复航,从而提高查询效率。

index_subquery

查询使用子查询的索引,当查询需要过滤大量数据时,使用子查询可以提高查询效率,而使用索引可以提高查询性能。

range

使用非唯一索引扫描部分索引,比如使用索引获取某些范围区间的记录

index

扫描整个索引进行匹配

all

扫描整个表进行匹配

possible_keys

表示在查询中可能使用到某个索引或多个索引,如果没有选择索引,显示NULL

key

表示在实际在查询中使用的索引,如果没有使用索引,显示NULL

key_len

  1. 表示当优化器决定使用某个索引执行查询时,该索引记录的最大长度
  2. 作用:使用联合索引的时候可以知道使用了哪几列

计算规则

字符串
  • char(n):n个字节
  • varchar(n):如果是utf-8,3n+2个字节,加2字节存储字符串长度;若是utf8mb4:4n+2字节(变长字段:2字节)
数值类型
  • tinyint:1字节

  • smallint:2字节

  • int:4字节

  • bigint:8字节

时间类型
  • date:3字节
  • timestamp:4字节
  • datetime:8字节
空值字段:1字节
  • 如果字段是NULL,需要1个字节记录是否为NULL

ref

表示将哪个字段或常量和key列所使用的字段进行比较

rows

  1. 全表扫描时标识需要扫描标的行数估计值;
  2. 索引扫描时标识扫描索引的行数估计值;
  3. 值越小越好。

filtered

  1. 表示符合查询条件的数据百分比。
  2. 可以使用rows * friltered /100 计算出与explain前一个表进行连接的行数。

Extra

Using Index

仅使用索引树中的信息从表中检索列信息,不用进行其他查找就可以读取实际行。(覆盖索引:可查询列都是索引列)

Using Index condition

表示先按条件过滤索引,过滤完索引后找到所有符合索引条件的书巨航,随后用where子句中的其他条件去过滤这些书巨航。(使用索引范围查找,因查找列未备索引全覆盖,最终会回表查询)

Using where

不是读取表的所有数据或不通过索引奇偶可以获取所有需要的数据。(未使用索引检索数据)

Using temporary

标识MySQL需要使用临时表来存储结果集,如果查询包含不同列的GROUP BY和ORDER BY子句,通常会发生这种情况。(使用临时表存储数据进行数据去重等操作)

Using filesort

当查询中包含order by操作而且无法利用索引完成的排序操作,数据较少时从内存排序,如果数据较多需要在磁盘中排序,需优化成索引排序。(未使用索引进行排序导致在内存中或硬盘中排序)

Select tables optimized away

使用某些聚合函数(min,max)来访问某个索引值。(无需查找表、索引就可以返回数据,效率非常高)

Using join buffer

使用join buffer降低对被驱动表的扫描次数。

Impossible where

where子句是没有满足条件的目标数据,不会命中人何行。

No tables used

当此查询没有FROM子句或拥有FROM DUAL子句时出现。

Full scan on NULL key

子查询中的一种优化方式,在无法通过索引访问null值的时候使用。

最佳实践建议

全值匹配

  1. MySQL全值匹配是指在使用复合索引时,查询条件要包含索引的所有列,才能最大程度的去利用索引。
  2. 通俗点就是where条件里把该加的条件加上。

最左前缀法则

  1. 若索引了多列,我们需要遵守最左前缀法则。
  2. 查询从索引的最左前列开始并且不跳过索引中的列。

索引列不操作

  1. 不在索引列上任何操作,如计算、函数、类型转换等。
  2. 索引列操作会导致索引失效而变成全表扫描。

范围条件导致索引失效

  1. 存储引擎不能使用索引中范围条件右边的列。
  2. 范围查询会使后面字段无序,造成部分索引失效。
  3. mysql内部优化器根据检索比例、表大小等多个因素整体评估是否使用索引,可以将大的范围拆分成多个小范围。

多用覆盖索引

  1. 尽量使用覆盖索引,不用星。
  2. 即减少select *,多用select col1,col2

不等空值还有or,索引失效

  1. !=或<>
  2. is null或is not null
  3. or或in

like百分写最右

  1. 如like ‘%五’,有可能会导致全表扫描。
  2. 用写右方式,如like ‘王%’

多用union all,少用union

  1. union是去重并排序;union all直接返回合并的结果,不去重也不排序;
  2. union all比union性能好。

连接查询代替子查询

  1. 减少子查询,用连接查询代替子查询。
  2. 加索引,提高查询性能。

使用limit

  1. 避免过渡提取数据。
  2. 优化分页查询,简化查询结果。

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

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

相关文章

解决 Elasticsearch cluster_block_exception 错误的终极指南

Elasticsearch 是一个功能强大的分布式搜索引擎&#xff0c;广泛应用于全文检索、实时分析等场景。 尽管如此&#xff0c;像任何复杂系统一样&#xff0c;它也会遇到一些运行问题&#xff0c;其中较为常见且影响较大的就是 cluster_block_exception 错误。 本文将深入解析这种错…

2024.10月16日- 关于Vue2(1)

一 VUE概述与环境搭建 1.1 Vue概述 1.1.1 简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款轻量级的用于构建用户界面的 渐进式的JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高…

入门!Linux 常见指令及权限管理全面指南

Linux 操作系统在现代计算机应用中扮演着重要的角色&#xff0c;广泛用于服务器、桌面系统、嵌入式设备及云计算平台等领域。理解和掌握 Linux 常见指令及权限管理机制&#xff0c;是每一位系统管理员和开发人员的基础技能。本文将详细介绍 Linux 系统的基本背景、常用指令、权…

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…

iOS IPA上传到App Store Connect的三种方案详解

引言 在iOS应用开发中&#xff0c;完成开发后的重要一步就是将IPA文件上传到App Store Connect以便进行测试或发布到App Store。无论是使用Xcode进行原生开发&#xff0c;还是通过uni-app、Flutter等跨平台工具生成的IPA文件&#xff0c;上传到App Store的流程都是类似的。苹果…

package.json 里的 dependencies和devDependencies区别

dependencies&#xff08;依赖的意思&#xff09;&#xff1a; 通过 --save 安装&#xff0c;是需要发布到生产环境的。 比如项目中使用react&#xff0c;那么没有这个包的依赖就会报错&#xff0c;因此把依赖写入dependencies npm install <package-name>// 缩写 np…

Android Framwork从零上手(一)下载编译AOSP源码

Android Framwork从零上手&#xff08;一&#xff09;下载编译AOSP源码 什么是AOSP硬件要求虚拟机安装开发环境搭建下载编译源码下载 repo 工具初始化仓库并同步远程代码编译源码运行模拟器 Android 系统开发涉及的知识面很广&#xff0c;代码量大&#xff0c;复杂度高&#xf…

传感器信号的存储和传输

对于大量传感器信号的存储和传输&#xff0c;可以采用以下存储和检测方案&#xff0c;以满足实时性、数据量、可靠性和传输带宽的需求&#xff1a; 1. 边缘计算 边缘计算是一种将计算和数据存储靠近数据源&#xff08;如传感器&#xff09;进行处理的方案。这可以减少数据传…

springboot扩展点都有哪些?

在Spring Boot中&#xff0c;扩展点指的是能够自定义或增强Spring Boot功能的机制。这些扩展点允许开发者在Spring Boot的基础设施之上做定制化配置、行为修改或增强。Spring Boot主要有以下几类扩展点&#xff1a; 1. ApplicationRunner 和 CommandLineRunner 这两个接口允许…

6、ES6

文章目录 一.关于ES6二.关于变量声明let声明变量const 声明常量 三.变量的解构赋值四.字符串的扩展五.函数的扩展函数默认参数rest参数箭头函数(函数的新写法) 六.数组的扩展七.对象的扩展语法上的简化对象的解构赋值 八.Symbol&#xff1a;新的数据类型(类似于字符串)独一无二…

CTFHUB技能树之SQL——时间盲注

开启靶场&#xff0c;打开链接&#xff1a; 说明这关对所有信息都做了统一输出&#xff0c;换成延时注入试试 输入&#xff1a; 1 and sleep(15) &#xff08;这里不知道为什么加上--倒是会影响sleep()函数的触发&#xff0c;从而没有延时感&#xff09; 可以观察到有明显的延…

vue3+ts+vite--路由跳转,params传参好像丢失了?

前言 相信大家一定写过后台管理系统&#xff0c;有一个很普遍的功能&#xff0c;就是点击编辑&#xff0c;根据id&#xff0c;跳转到相对应的编辑页面&#xff0c;id是通过路由params传递过去了&#xff0c;但是还有一个需求是要将父组件的名称也传递过去 &#xff0c;过程特别…

宁波市网站建设让你的网站更吸引人

宁波市网站建设让你的网站更吸引人 在数字化时代&#xff0c;拥有一个吸引人的网站已成为企业成功的关键因素之一。尤其在宁波市&#xff0c;随着经济的发展和互联网的普及&#xff0c;越来越多的企业意识到网站建设的重要性。那么&#xff0c;如何才能让你的网站更加吸引人呢&…

webstorm 编辑器配置及配置迁移

1.下载地址 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装&#xff0c;可根据需要是否删除已有版本 注意&#xff1a; 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如&#xff1a…

汽车免拆诊断案例 | 2023款零跑C01纯电车后备厢盖无法电动打开和关闭

故障现象  一辆2023款零跑C01纯电车&#xff0c;累计行驶里程约为2万km&#xff0c;车主进厂反映&#xff0c;后备厢盖无法电动打开和关闭。 故障诊断  接车后试车&#xff0c;操作后备厢盖外侧、驾驶人侧及遥控钥匙上的后备厢盖开启按钮&#xff0c;可以听到后备厢盖解锁的…

J1:ResNet-50算法实战与解析(鸟类识别)

J1周&#xff1a;ResNet-50算法实战与解析(鸟类识别&#xff09; **理论背景**☕1、CNN算法发展2、ResNet介绍3、ResNet-50介绍1、Input->STAGE 0:2、残差块&#xff08;STAGE1->STAGE4&#xff09; **PyTorch实现**1、导入库并设置GPU2、导入和检查数据3、划分数据集4、…

图示详解OpenEuler下Samba多用户身份验证配置、测试

前言 前文《图例详解OpenEuler下Samba安装、配置和测试》已对Samba服务的工作原理、安装、配置和测试&#xff0c;做了系统的介绍&#xff0c;并对匿名用户的访问samba服务器做了配置&#xff0c;相必读者已对samba服务的流程有了初步、系统的了解&#xff0c;本文在以上基础上…

C++进阶:哈希

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 哈希概念 哈希(hash)⼜称散列&#xff0c;是⼀种组织数据的⽅式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系&#xff0c;查找时通过这个哈希函数…

C语言:符号“->”在C语言中什么意思呢?

1.C语言中符号“->”的意义&#xff1a; ‌指针中的->表示用于访问指针所指向的结构体或联合体的成员。‌ 这是一个操作符&#xff0c;通常用于简化代码&#xff0c;可以替代使用(*ptr).member的方式。 ->操作符的具体用法是&#xff0c;当你有一个指向结构体的指针时…

MySQL数据库:基础介绍下载与安装

数据库基础知识先谈发音MySQL如何发音&#xff1f;在国内MySQL发音有很多种&#xff0c;Oracle官方文档说他们念作My sequal[si:kwəl]。 数据库基本概念 1。数据数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这些符号是可识别的、抽…