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 错误。 本文将深入解析这种错…

Springboot项目

《《《《《《《《《《《------ 项目建立 ------》》》》》》》》》》》》 1.新建项目&#xff0c;选择Spring Initializer&#xff08;新版本选择Spring boot&#xff09; 我的项目是JDK1.8的&#xff0c;所以在项目SDK就选择了1.8版本的&#xff0c;选择启动服务URL地…

2024江苏省赛E. Divide

补题链接 题目大意: 每次操作会把区间内最大值除以2&#xff0c;q次询问&#xff0c;问[l,r]操作k次后的结果是什么 分析: 一道主席树的题目,可以先最整个区间一直进行除以2的操作&#xff0c;问区间[l,r]操作后结果&#xff0c;其实就可以转化为求区间第k1大的结果,反转一下…

常用DateUtils工具类

package com.gh.common.utils; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** 类描述&#xff1a; ClassName DateUtils Description TODO …

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; 可以观察到有明显的延…

【小白学机器学习16】 概率论的世界观2

目录 一 从正态分布说起 1.1 正态分布是自然分布&#xff0c;是客观 1.2 万物不齐 1.3 中庸 1.4 动态平衡 正态分布&#xff0c;概率论都是一种世界观 一 从正态分布说起 1.1 正态分布是自然分布&#xff0c;是客观 世界是客观的&#xff0c;是不以人们的意志想法为转…

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

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

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

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

贪心day7

文章目录 前言使每位学生都有座位的最少移动次数分发饼干运动员和训练师的最大匹配数检查一个字符串是否可以打破另一个字符串优势洗牌 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#x…

webstorm 编辑器配置及配置迁移

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

性能测试概念篇

一、性能测试(概念&#xff09; 为了发现系统性能问题或获取系统性能相关指标而进⾏的测试 ⼀般在真实环境、特定负载条件下&#xff0c;通过⼯具模拟实际软件系统的运行及其操作&#xff0c;同时监控性能各项指标&#xff0c;最后对测试结果进行分析来确定系统的性能情况 常…