广告
返回顶部
首页 > 资讯 > 数据库 >Mysql Explain 关键字
  • 537
分享到

Mysql Explain 关键字

MysqlExplain关键字 2021-11-06 03:11:41 537人浏览 无得
摘要

-- 实际sql,查找用户名为Jefabc的员工 select * from emp where name = "Jefabc"; -- 查看SQL是否使用索引,前面加上explain即可 explain sele

Mysql Explain 关键字

-- 实际sql,查找用户名为Jefabc的员工
select * from emp where name = "Jefabc";   
-- 查看SQL是否使用索引,前面加上explain即可
explain select * from emp where name = "Jefabc";

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明

下面对这些字段出现的可能进行解释:

一、 id

SELECT识别符。这是SELECT的查询序列号

我的理解是SQL执行的顺序的标识,SQL从大到小的执行

id相同时,执行顺序由上至下

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

id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

-- 查看在研发部并且名字以Jef开头的员工,经典查询
explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like "Jef%" and d.name = "研发部";

二、select_type

表示查询中每个select子句的类型

(1) SIMPLE(简单SELECT,不使用UNION或子查询等)

(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

(3) UNION(UNION中的第二个或后面的SELECT语句)

(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)

(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)

(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)

(8) DERIVED(派生表的SELECT, FROM子句的子查询)

(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

三、table

显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称

四、type

对表访问方式,表示Mysql在表中找到所需行的方式,又称“访问类型”。

常用的类型有:** ALL、index、range、 ref、eq_ref、const、system、**NULL(从左到右,性能从差到好)

ALL:Full Table Scan, mysql将遍历全表以找到匹配的行

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

range:只检索给定范围的行,使用一个索引来选择行

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

五、possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

六、Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

七、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

不损失精确性的情况下,长度越短越好

八、ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

九、rows

 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

十、Extra

该列包含MySQL解决查询的详细信息,有以下几种情况:

Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by

Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”

-- 测试Extra的filesort
explain select * from emp order by name;

Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。

Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

No tables used:Query语句中使用from dual 或不含任何from子句

-- explain select now() from dual;

总结:
• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

通过收集统计信息不可能存在结果

原文地址:MySQL Explain详解

您可能感兴趣的文档:

--结束END--

本文标题: Mysql Explain 关键字

本文链接: https://www.lsjlt.com/news/4799.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql Explain 关键字
    -- 实际SQL,查找用户名为Jefabc的员工 select * from emp where name = "Jefabc"; -- 查看SQL是否使用索引,前面加上explain即可 explain sele...
    99+
    2021-11-06
    Mysql Explain 关键字
  • MySQL如何基于Explain关键字优化索引功能
      explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。简单讲,它的作用就是分析查询性能。   explain关键字的使用方法很简单,就...
    99+
    2022-05-12
    MySQL Explain关键字 索引
  • mysql中的关键字
    MySQL是一种流行的开源关系型数据库管理系统,包含许多关键字,这些关键字在MySQL中具有特殊的含义,用于执行各种数据库操作。以下是MySQL中的一些关键字及其用法: ADD:用于向现有表添加一列或...
    99+
    2023-09-05
    mysql 数据库 sql
  • 表字段与mysql关键字冲突
    项目启动提示语法错误[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server ver...
    99+
    2019-12-13
    表字段与mysql关键字冲突 数据库入门 数据库基础教程 数据库 mysql
  • mysql中有没有关键字
    这篇文章主要介绍“mysql中有没有关键字”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql中有没有关键字”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
    mysql
  • MySQL之外键、表关系及SQL查询关键字
    一、外键 假设现在我们有一张员工信息表,表的字段如下: id # 主键 name # 姓名 age # 年龄 dep_name # 部门名称 dep_desc # 部门描述 单从数据存储上来看,这个表是没有问题的,但是从程序开...
    99+
    2018-09-24
    MySQL之外键 表关系及SQL查询关键字
  • mysql 8 系统保留关键字
    mysql 8 中的系统保留关键字 在mysql中建表时,一定要注意避免使用系统的保留关键字,不然可能数据表创建成功了,但是在使用环节(增删改查)等,造成极大的不变,重则甚至返工修改字段。 所以,在建表前一定要排查一下建表字段是否与mysq...
    99+
    2021-03-19
    mysql 8 系统保留关键字
  • MySQL怎么使用ESCAPE关键字
    这篇文章主要介绍了MySQL怎么使用ESCAPE关键字,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL转义转义即表示转义字符原来的语...
    99+
    2022-10-18
    mysql escape
  • 【MySQL】EXPLAIN 语句 各字段 详解
    EXPLAIN 语句 概貌 在连接查询的执行计划中: 每个表都会对应一条记录,这些记录的 id 列的值是相同的; 在包含子查询的执行计划中 :每个 select关键字都会对应一个唯...
    99+
    2023-10-27
    mysql 数据库
  • MySQL关于命令的问题、Exists关键字
    truncate 与 delete 的区别 truncate table :删除内容、不删除定义、释放空间。 delete table : 删除内容、不删除定义、不释放空间。 drop table :删除内容和定义,释放...
    99+
    2017-12-20
    MySQL关于命令的问题 Exists关键字
  • Python nonlocal关键字 与 global 关键字解析
    目录1.nonlocal2.globalpython引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 1.no...
    99+
    2022-11-13
    Python nonlocal关键字 Python global 关键字
  • 关于MySQL中explain工具的使用
    目录输出结果详解:EXPLAIN 是 mysql 提供的一种工具,用于分析查询语句的执行计划,即查询优化器是如何决定执行查询语句的。EXPLAIN可以帮助我们分析查询语句的性能瓶颈,找出问题所在,进而优化查询语句和数据库...
    99+
    2023-05-06
    MySQL工具 MySQL explain
  • mysql中left join关键字的使用
    本篇文章给大家分享的是有关mysql中left join关键字的使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。left join关键字LE...
    99+
    2022-10-18
    left join mysql
  • mysql的having关键字如何用
    这篇文章主要讲解了“mysql的having关键字如何用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的having关键字如何...
    99+
    2022-10-19
    mysql having
  • mysql的index关键字怎么使用
    这篇文章主要讲解了“mysql的index关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的index关键字怎么使用”吧! ...
    99+
    2022-10-19
    mysql index
  • synchronized 关键字
    文章目录 一、synchronized 的特性互斥可重入 二、 synchronized 使用示例三、 java标准库的线程安全类四、 死锁可重入死锁相互争夺锁哲学家就餐问题死锁的四个必...
    99+
    2023-09-04
    java 开发语言 操作系统
  • Python中nonlocal关键字与global关键字怎么用
    小编给大家分享一下Python中nonlocal关键字与global关键字怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python引用变量的顺序: 当前作...
    99+
    2023-06-29
  • MySQL中ESCAPE关键字的用法详解
    MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。 MySQL中,转义字符以“\”开头,编程中常见的转义字符,在M...
    99+
    2022-05-30
    MySQL ESCAPE关键字 MySQL ESCAPE
  • Mysql子查询关键字如何使用
    本文小编为大家详细介绍“Mysql子查询关键字如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql子查询关键字如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. all1.1 格式1.2 特...
    99+
    2023-07-02
  • Python3 关键字nonlocal
    关键字nonlocal 在Python 2.x中,闭包只能读外部函数的变量,而不能改写它。为了解决这个问题,Python 3.x引入了nonlocal关键字,在闭包内用nonlocal声明变量,就可以让解释器在外层函数中查找变量名。 注意...
    99+
    2023-01-31
    关键字 nonlocal
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作