MySQL的explain工具介绍

文章目录

  • 介绍
  • explain extended
  • show warings
  • explain partitions
  • id 字段
  • select_type
  • type
  • key
  • possible_keys
  • key_len
    • key_len 计算规则
  • ref
  • rows
  • extra

介绍

使用 explain 可以模拟优化器执行 SQL 语句,会返回 SQL 语句的执行计划信息,但是不会真正去执行这条 SQL 语句。

注:如果 from 中包含子查询,则会真正执行子查询,将结果放入临时表中(衍生表)。

explain extended

会在 explain 的基础上额外返回 filtered,根据 rows*(filtered/100) 可以估算出将要和前一个表进行连接的行数。前一个表是指相对于当前表靠后执行的表,即 id 值更小的表

5.7 版本后不需要加 extended。

show warings

在 explain 语句后面紧跟着 show warings 语句,可以得到优化后的查询语句,从而看出优化器优化了什么。

mysql> EXPLAIN EXTENDED SELECT * from `user` where `NAME` LIKE 'zhangsan' \G 
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 3filtered: 33.33Extra: Using where
1 row in set, 2 warnings (0.00 sec)mysql> SHOW WARNINGS \G
*************************** 1. row ***************************Level: WarningCode: 1681
Message: 'EXTENDED' is deprecated and will be removed in a future release.
*************************** 2. row ***************************Level: NoteCode: 1003
Message: /* select#1 */ select `test`.`user`.`id` AS `id`,`test`.`user`.`NAME` AS `NAME` from `test`.`user` where (`test`.`user`.`NAME` like 'zhangsan')
2 rows in set (0.00 sec)

explain partitions

相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。

5.7 版本后不需要加 partitions。

id 字段

mysql> explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;

执行计划信息如下:
在这里插入图片描述

id 值越大,表示越优先执行。上图中可以看到 from 子句中的衍生表查询的优先级最高,所以最先执行;接着执行 select 子句中的子查询;最后执行最外面的主查询。

select_type

simple:简单查询
primary:复杂查询中的最外层的查询
subquery:包含在 select 子句中的子查询
derived:包含在 from 子句中的子查询,derived 表示衍生的,因为 from 子句中的子查询结果会放入临时表中,其实就是一个衍生表

type

system:表示查询的表只有一条记录,所以查询效率很高。这种类型不需要优化

const:表示查询条件是某个具体的索引值,例如主键索引或者唯一索引,所以表最多有一条匹配的数据记录,只要读取1次,效率很高。这种类型不需要优化。

range:表示查询条件是某个区间,最好要优化到这个类型

eq_ref:在多表关联查询时,主键所在表的查询类型就是 eq_ref,因为主键是唯一的;当然如果使用唯一键关联查询也属于这种类型。这种类型的查询基本不要优化了

ref:表示查询条件使用普通索引,而不是唯一索引,结果可能是多条记录

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

all:表示全表扫描,效率很低,需要优化

key

查询语句用到的索引名称

possible_keys

执行 SQL 语句可能会用到的索引,但是最后执行时不一定用到

key_len

这一列显示了mysq 在索引里使用的字节数,通过这个值可以算出具体使用了复合索引中的哪些列。举例来说,film_actor 表的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个 int 列组成,并且每个 int 是 4 字节。通过结果中的 key_len=4 可推断出查询使用了第一个列:film_id 列来执行索引查找。

key_len 计算规则

1.字符串
char(n):n字节长度
varchar((n):如果是u-8,则长度 3n+2 字节,加的2字节用来存储字符串长度数值

2.数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节

3.时间类型
date:3字节
timestamp:4字节
datetime:8字节

注意:
1.如果字段允许为 NULL,需要 1 字节记录是否为 NULL
2.索引最大长度是 768 字节,当字符串过长时,MySQL 会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引

ref

查询语句中,如果查询条件使用了常量,则会显示 const,如下:

mysql> select * from film_actor where film_id = 2 and actor_id = 5;

执行计划信息:
在这里插入图片描述
注:如果多表关联查询,这个 ref 会显示关联中的唯一索引字段。

rows

查询语句可能扫描的行数

extra

using index:表示使用覆盖索引
using where:表示使用了 where 子句,且查询的字段没有被二级索引全覆盖,通常查询语句没有用到任何索引
using index condition:通常查询条件使用到了联合索引的前面几个字段,而且查询的字段没有完全被二级索引覆盖
using temporary:表示使用了临时表处理查询
using filesort:表示使用索引字段以外的方式进行排序,效率较低
select tables optimized away:使用聚合函数访问索引字段

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

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

相关文章

jetty设置双向ssl_在Jetty中设置SSL

jetty设置双向ssl当您必须快速启用SSL并陷入困境时,您是否遇到了问题:-( 你并不孤单,我将分享我的痛苦和一些学习。 我将分享在码头上启用SSL的步骤。 警告:仅将以下说明用于开发人员设置和生产,请联系您的安全专家…

使用Thumbnailator压缩照片

导入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>代码 package com.asx.hyd.non.trs;import net.coobird.thumbnailator.Thumbnails;impo…

MySQL的索引优化

文章目录全值匹配最左前缀原则不在索引列上使用函数&#xff0c;会导致索引失效而转向使用全表扫描范围条件右边的索引列会失效尽量使用覆盖索引使用不等于操作符无法使用索引is null&#xff0c;is not null 一般情况下也无法使用索引like 以通配符开头的&#xff0c;索引会失…

cuba 平台_认识CLI for CUBA平台

cuba 平台毫无疑问&#xff0c;软件开发人员&#xff08;尤其是Java开发人员&#xff09;的世界充满了键盘狂热者&#xff0c;最好通过单击一下鼠标键入10-15个字母。 而且我们的社区也不例外&#xff0c;因此我们经常被问到“如何在没有CUBA Studio的情况下启动项目&#xff1…

关闭zookeeper进程

查看端口是否占用 netstat -ano|findstr “2181” 关闭相应进程 tskill 端口号 MAC启动配置文件 找到对应路径 /Users/mac/Desktop/soft/software/apache-zookeeper-3.8.0/bin启动zookeeper ./zkServer.sh start查看状态 ./zkServer.sh status关闭zookeeper ./zkServe…

Linux系统下,虚拟终端开启256色_虚拟终端类型xterm开启256色

文章目录查看当前终端类型修改终端类型查看当前终端类型 现在的终端模拟器早就支持256色了&#xff0c;不过默认可能还是8色的。 开启终端&#xff0c;查看终端类型&#xff1a; [roothtlwk0001host ~]# echo $TERM xterm接着查看 xterm 终端支持的颜色&#xff1a; [rooth…

io.realm:rea_使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述...

io.realm:rea如今&#xff0c;人们需要具有高用户体验的高响应性&#xff0c;交互式应用程序&#xff0c;这通常意味着要处理异步性&#xff0c;尤其是当应用程序涉及高负载&#xff0c;实时数据和多用户时。 由于Java是一种固有的语言&#xff0c;它固有地支持命令式编程风格…

解决postman请求乱码问题

在请求头里加入 Content-Type&#xff1a;application/json;charsetUTF-8

vim如何开启256色

相同的colorschema&#xff0c;vim 和 gvim 的颜色差距还是很大的&#xff0c;因为 gvim 使用 X 的颜色&#xff0c;而 vim 只能使用终端提供的颜色&#xff0c;所以造成了二者的显示差异。所以 vim 开启 256 色&#xff0c;必须开启终端的 256 色&#xff0c;另请参见《Linux系…

spring boot分层_只需5分钟即可启动并运行分层架构:: Spring Boot第1部分

spring boot分层这是一个分为两部分的系列&#xff0c;其中我将展示如何使用Spring Boot创建分层体系结构。 什么是分层体系结构&#xff1a;简而言之&#xff0c;当我们构建企业应用程序时&#xff0c;我们维护不同的层以封装特定于层的逻辑&#xff0c;这样就不会溢出到另一…

java相除保留两位小数_Java:Java快速入门

源代码组织方式Java程序由packageclass组成&#xff0c;package对应目录的相对路径。1 package com.happyframework.javastudy.hello;2 3 public final class Hello {4 public static void hello(){5 System.out.println("hello!");6 }7 }关于class有如下几点规则&am…

Linux系统下与终端相关的命令

文章目录一、命令 who or w 可以显示有哪些终端登录二、命令 who am i 用来显示当前终端是哪一个三、命令 tty 显示当前终端的设备文件四、命令 chvt 用来切换虚拟终端五、命令 last 显示每个终端的登录时间和持续时间等信息六、命令 toe -a 列出系统支持的所有终端类型七、命令…

jdk switch 枚举_JDK 12开关表达式遇到意外的枚举值

jdk switch 枚举正如我在“ 玩JDK 12的Switch表达式 ”一文中所写的那样&#xff0c; JDK 12 Early Access Build使JEP 325 [“ Switch Expressions&#xff08;Preview&#xff09;”&#xff09;实现的实验变得容易。 我的帖子“ JDK 12&#xff1a;实际中的切换语句/表达式 …

MacBook/MacOS如何写入MacBook特有的符号(例如:⌘/⌥/⎋/⇪)

文章目录步骤说明图文说明步骤说明 1.打开「表情与符号」 按快捷键 Ctrl Command Space 打开「表情与符号」窗口&#xff1b;你也可以在顶部菜单栏中的输入法&#xff0c;然后点击下拉的菜单列表中的「显示表情与符号」。如果找不到这个菜单项&#xff0c;你需要在电脑的「系…

java-jar jvm_使用Java流和In-JVM-Memory的超低延迟查询

java-jar jvm自然界的基本规则&#xff08;例如光速和通用信息论&#xff09;对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制。 了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级。 例如&#xff0c;如果应用程序服务器和数据库服务器相距…

关闭进程

查看端口是否被占用 netstat -ano|findstr “2181” 关闭进程 tskill port

iTerm2 for MacOS(终端模拟器/终端仿真器/命令终端工具)设置详解

文章目录General 通用Startup 启动Closing 关闭MagicSelectionWindowtmuxAppearanceGeneral隐藏程序图标theme 主题tab bar location 选项卡栏位置status bar location状态栏位置WindowsTabsPanesDimming 调光Profiles 配置文件General自定义终端界面的标志自定义标签页标题Sho…

dcdc芯片效率不高的原因_研学丨燃料电池车的典型效率及能耗

燃料电池的一大优势是高效率&#xff0c;能够更高效的利用能源。现在燃料电池车的研发已经持续了相当长一段时间(世界上第一辆燃料电池车为1966年通用的Electrovan)&#xff0c;燃料电池车也迭代了许多&#xff0c;那么燃料电池车的效率、氢耗水平都怎么样呢&#xff1f;这里通…

groovy lambda_Java Lambda流和Groovy Clouse的比较

groovy lambda这篇博客文章将研究List数据结构上的一些谚语操作&#xff0c;并对Java 8/9和Groovy语法进行一些比较。 因此&#xff0c;首先是数据结构。 这只是一个简单的橄榄球球员&#xff0c;具有名字和等级。 Java class RugbyPlayer {private String name;private Inte…

Maven定制化打包后的包名(加入时间戳)

在对应的pom文件中加入配置 设置时间戳格式 <properties> <maven.build.timestamp.format>yyyy-MM-dd_HH_mm</maven.build.timestamp.format> </properties> 定制包名字 <build> <finalName>${project.artifactId}-${project.versio…