【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

这篇具有很好参考价值的文章主要介绍了【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

ID

select_type 查询类型

table 表名

type 关联类型/访问类型

possible_keys MySQL觉得可能要用到的索引

key 实际用到的索引

key_len 用到的索引的长度(比如可用于判断使用了联合索引中的哪几个)

ref 表查找值所用的列(表名.字段)或常量(const)

row 预估要读取并检测的行数

Extra 额外信息

The EXPLAIN statement provides information about how MySQL executes statements.

EXPLAIN提供MySQL如何执行语句的信息,举个例子

EXPLAIN SELECT name FROM app_user WHERE id = 1;

就是在你要执行的查询语句前加一个EXPLAIN,就可以查看执行当前语句的具体信息,比如属于什么查询类型啦~走了什么索引啦(具体如下图)~

总的来说,通过EXPLAIN我们可以获取以下信息:

  • 表的读取顺序

  • 数据读取操作的操作类型

  • 使用了哪些索引

  • 每张表优化器查询了多少行数据

【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

 我们在碰到一些类型“慢查询”问题时,一般会使用EXPLAIN来分析我们的SQL还有哪些地方可以做优化,具体就是根据上图中列表字段进行分析的,本篇就把EXPLAIN的关键字段挖个地儿朝天,👩再也不用担心要如何对SQL进行优化叻( ̄∇ ̄)/

ID

ID越大越先执行,一致按先后顺序执行

select_type 查询类型

这里只列出了常见的几种,想更加深入可以戳官网

https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_select_typehttps://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_select_type

  • SIMPLE 简单查询(无联合查询或者子查询)

  • PRIMARY 复杂查询中最外层的select

  • DERIVED from后面的临时表(派生表)

  • SUBQUERY select后面的临时表

  • UNION union中第二个(或者说后一个)select

table 表名

表示结果集出自哪张表

举个🌰,如果某个查询table的值为<devired3>的含义就是这个select是从ID为3的派生表中进行查询的

type 关联类型/访问类型

类型

解释

备注

NULL

在优化阶段分解查询语句,使得在执行阶段无需再访问表/索引

system

无需进行磁盘IO,并且要查询的结果集只有一行记录

属于constant 的特殊情况

constant

查找主键索引,MySQL能对查询的某部分进行优化将其转换为一个常量(走主键(primary key)或者唯一(unique key)索引),所以表中最多有一个匹配行,只需要读取1次

  • 可以使用show warnings;查看优化后的版本

eq_ref

查找唯一性索引,比如表链接时,使用主键/唯一索引进行关联的表查询,最多只会返回1条数据

ref

使用普通索引/非唯一性索引(从根节点开始),或者唯一性索引的部分前缀,索引要进行比较,有可能查出多条结果集

使用了联合主键前缀也是这种类型

range

查询某个索引的部分索引,范围扫描,通常出现在in()/between/>/</>=/<=等操作中,使用一个索引来检索指定范围

查询效率跟结果集大小相关(可使用分页等方式进行优化)

index (全索引扫描)

查找全部索引树,表示扫描全索引可以拿到结果(从1开始遍历),一半是扫描某个二级索引,这种扫描一般不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般会使用覆盖索引,二级索引一般比较小(主键索引包含数据,一般会比较大,因而读取的磁盘数据较大),所以index通常会比ALL快一些

  • 如果主键索引和二级索引都包含结果集,MySQL会选用小的索引进行查询

  • 虽然index也使用到了索引,但是和ref使用索引的方式不同,index是通过叶子节点从第一条索引开始向下遍历的,而ref是从索引的根节点开始折半查找,因而ref效率比index快很多

ALL

全表扫描,不使用任何索引,从第一个主键(聚簇索引的所有叶子节点)开始向下查找

possible_keys MySQL觉得可能要用到的索引

key 实际用到的索引

key_len 用到的索引的长度(比如可用于判断使用了联合索引中的哪几个)

类型

具体类型

长度

字符串

char(n)

n字节

varchar(n)

如果是utf-8则长度3n+2 字节,加的2字节用于存储字符串长度

utf-8一个占3字节

数值类型

tinyint

1字节

smallyint

2字节

int

4字节

bigint

8字节

时间类型

date

3字节

timestamp

4字节

NULL

NULL

1字节

允许为空还有1个字段记录是否为空

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

ref 表查找值所用的列(表名.字段)或常量(const)

这一列显示了在key列记录的索引中,表查找值所用到的列/常量

row 预估要读取并检测的行数

Extra 额外信息

  • Using index

      查询结果集使用了覆盖索引覆盖索引是一种查询方式,表示要查询的结果字段在查询的索引树中全部包括,无需再回表

      覆盖索引是指MySQL执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引树中获取,这种情况一般可以说是使用了覆盖索引,extra列中就会显示Using Index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其他字段值

    • 优化点

          如果出现回表的情况,即在查询字段中有一个字段没有加索引或者出现索引失效的问题,导致sql回表走了全表扫描,就可以使用覆盖索引进行优化

  • Using index condition

      查询的列不完全被索引覆盖,where条件之前一个前导列的范围

  • Using temporary/Using filesort

      使用了临时表

  • Using where

      使用Where语句处理结果,并且查询到的列未被索引覆盖

……

上面是一些常见的类型,其他还有很多,感兴趣可以参考官网

MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format文章来源地址https://www.toymoban.com/news/detail-405611.html

到了这里,关于【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试被问到了解哪些开发模型?看这一篇就够了

    软件开发模型是指软件开发全部过程、活动和任务的结构框架。一般包括需求、设计、编码和测试等阶段,甚至包括维护阶段。软件开发模型明确规定了软件开发过程中要完成的主要活动和任务,用来指导整个开发过程中的工作。对于不同的系统,可依据软件的特点、项目成

    2024年02月04日
    浏览(59)
  • JavaScript的选择结构你真的了解吗?(看完这一篇就够了)

    ​🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖 人终将被年少不可得之物困其一生 依旧 青山 ,本期给大家带来JavaScript篇专栏内容:JavaScript-选择结构 目录 选择结构 实现选择结构的语句 三元(目)运算符 案例 判断一个年份是闰年还是平年 判断一个数是偶数还是奇数

    2024年02月04日
    浏览(32)
  • MySQL数据库期末复习--这一篇就够了

    目录 一、前言 二、一些基本概念 1、时态数据库 2、分布式数据库 3、面向对象数据库 4、移动数据库 三、数据库的创建 1、工具 2、基本需求 3、根据上述需求画出E-R图 4、将E-R图转换成关系模式 5、建立数据表 6、每张数据表的结构 四、视图 1、创建视图 2、查看视图  3、更

    2024年02月09日
    浏览(58)
  • 还是搞不懂Anaconda是什么?读这一篇文章就够了

    概述 Anaconda ,中文 大蟒蛇 ,是一个开源的Anaconda是专注于数据分析的Python发行版本,包含了conda、Python等190多个科学包及其依赖项。 Anaconda就是可以便捷获取包且对包能够进行管理,包括了python和很多常见的软件库和一个包管理器conda。常见的科学计算类的库都包含在里面了

    2024年02月03日
    浏览(82)
  • JetCache 使用简单案例到源码解析读这一篇就够

    github.com/alibaba/jet… EnableMethodCache,EnableCreateCacheAnnotation这两个注解分别激活Cached和CreateCache注解,其他和标准的Spring Boot程序是一样的。这个类可以直接main方法运行、 User类: UserService: UserSercviceImpl 测试: 缓存实体必须序列化 使用过程中可能会出现包冲突: 解决方法:

    2024年02月04日
    浏览(34)
  • MySQL入门阶段这一篇就够了-学习笔记(手敲1.5万字)

    虽然在大一下学期,就已经接触到了MySQL,但是那个时候只是会用MySQL进行增删改查,在大三上学期,尝试投简历寻找实习时,对方公司对于程序员的MySQL水平有很高的要求,所以我开始系统化的学习MySQL。顺便将整理出的笔记逐步写入博客中,日积月累,准备发表一篇长篇博

    2024年02月15日
    浏览(38)
  • Mysql的安装配置教程(非常详细)从零基础入门到精通,看完这一篇就够了

    首先简单概述分为几个步骤: 一、下载Mysql 二、安装Mysql 三、验证Mysql安装是否成功 四、 配置环境变量 五、验证配置环境变量是否成功 一、下载Mysql 要在Windows或Mac上安装MySQL,首先从MySQL官方网站下载最新的MySQL Community Server版本: 官网:https://www.mysql.com/ 1.首先进入官网页面

    2024年02月05日
    浏览(44)
  • docker入门,这一篇就够了。

    Docker容器虚拟化平台。 今天跟大家分享一下我的docker学习历程,也算是我的独特的复习笔记,我会在这一篇中讲清楚docker几乎所有的功能。不过也是我第一次写,而且是一篇两万多字的长文,花了我半个月里所有的休闲娱乐时间,所以写的不好的地方请大家见谅,也请在评论

    2024年02月03日
    浏览(45)
  • 学习SpringSecurity这一篇就够了

    案例源码地址:https://gitee.com/gzl_com/spring-security.git 1.1、概要 Spring Security 是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 安全方面的两个主要区域是“ 认证 ”和“ 授权 ”。在Web 应用又称之为 用户认证 和 用户授权 两个部

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包