我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql中explain命令返回参数的具体使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql中explain命令返回参数的具体使用

explain 是mysql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要,这篇文章主要介绍了MySql explain命令返回结果解读,需要的朋友可以参考下。

1. explain命令是什么东西?

explain 是MySql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要。

2.explain命令返回列解读

| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                      |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+
|  1 | PRIMARY     | SC      | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   18 |    10.00 | Using where                                |
|  1 | PRIMARY     | Student | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   12 |    10.00 | Using where; Using join buffer (hash join) |
|  2 | SUBQUERY    | Teacher | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where                                |
|  2 | SUBQUERY    | Course  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where; Using join buffer (hash join) |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+

2.1 id

一个编号,表示select所属的行。如果查询中没有子查询或关联查询,那么只会有唯一的SELECT,每一行的该列中都将显示一个1,否则,内层的SELECT语句一般会顺序编号,对应于其在原始语句中的位置。id越大执行优先级越高,id相同则认为是一组,从上往下执行,id为NULL最后执行。

2.2 select_type

查询类型,表示当前SQL语句是简单查询还是复杂查询

  • SIMPLE:简单查询,不包含任何连接查询和子查询。
  • PRIMARY:查询中若查询包含任何复杂的子部分,最外层的select被标记为PRIMARY。
  • UNION:当前SQL语句是连接查询时,表示连接查询的第二个SELECT语句或者第二个后面的SELECT语句。
  • DEPENDENT UNION:含义与UNION几乎相同,但是DEPENDENT UNION取决于外层的查询语句。
  • UNION RESULT:表示UNION连接查询的结果信息。
  • SUBQUERY:包含在SELECT子句(不在from子句中)中的子查询的SELECT,结果不依赖于外部查询。
  • DEPENDENT SUBQUERY:含义与SUBQUERY几乎相同,但是DEPENDENTSUBQUERY取决于外层的查询语句。
  • DERIVED:表示FROM子句中的子查询。
  • MATERIALIZED:表示实例化子查询。
  • UNCACHEABLE SUBQUERY:表示不缓存子查询的结果数据,重新计算外部查询的每一行数据。
  • UNCACHEABLE UNION:表示不缓存连接查询的结果数据,每次执行连接查询时都会重新计算数据结果。

2.3 table

2.4 partitions 如果当前数据表是分区表,则表示查询结果匹配的分区

2.5 type(重要)

其取值从最优到最差依次为:

null > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge> unique_subquery > index_subquery > range > index > ALL

  • NULL: 这种访问方式意味着MySQ能在优化阶段分解查询语句,在执行阶段甚至不需要再访问表或者索引。例如,从一个索引列里选取最小值可以通过单独查询索引来完成,不需要在执行时访问表。
  • system:查询的数据表中只有一行数据,是const类型的特例
  • const:当MySQL能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。比如通过将某一行的主键访问WHERE字句的方式来查询主键:SELECT id from t where id = 1。此时MySQL就能把这个查询转换为一个常量。
  • eq_ref: 使用这种索引查找,MySQL清楚的知道最多只返回一条符合条件的记录,使用主键或者唯一值索引查找时能看到这种方法。MySQL对于这种访问类型的优化做得非常好,因为它知道到无需估计匹配行的范文或者在找到匹配行后再继续查找(因为值不会重复)。
  • ref: 索引访问,也叫索引查找。返回所有匹配某个单个值的行,然而它可能会找到符合条件的多个行。此类索引访问只有当使用非唯一性索引或者唯一索引的非唯一性前缀时才会发生。把他叫ref是因为他要和某个参考值相比较。这个参考值或者是一个常数,或者来自多表查询前一个表里的结果值
  • fulltext:当查询条件使用了全文索引时,type的取值为fulltext
  • ref_or_null:类似于ref,但是当查询语句的连接条件或者查询条件包含的列有NULL值时,MySQL会进行额外查询,经常被用于解析子查询。典型的场景为 is null
  • index_merge: 当查询语句使用索引合并优化时,type的取值为index_merge。此时,key列会显示使用到的所有索引,key_len显示使用到的索引的最长键长值
  • unique_subquery: 当查询语句的查询条件为IN的语句,并且IN语句中的查询字段为数据表的主键或者非空唯一索引字段时,type的取值为unique_subquery。
  • index_subquery: 与unique_subquery类似,但是IN语句中的查询字段为数据表中的非唯一索引字段。
  • range: 范围扫描,就是一个有限制的索引扫描,使用一个索引来检索给定范围的行,不需要遍历全部索引。范围扫描通常出现在between,>,<,>=等操作中。in()和OR也会显示范围扫描,但这两者其实是不同的访问类型,性能上也有差异。此类查找的开销根ref索引访问的开销相当。
  • index:跟全表扫描一样,只是MySQL扫描表时按照索引次序进行而不是行,主要优点是避免了排序;缺点是要承担按索引次序读取整个表的开销。
  • ALL:全表扫描,从头到尾的查找所需要的行。但仍然存在例外,例如使用了 LIMIT ,或者Extra 列中显示 Using distinct/not exists。

2.6 possible_keys

执行查询语句时可能用到的索引,但是在实际查询中未必会用到。当此列为NULL时,说明没有可使用的索引,此时可以通过建立索引来提高查询的性能。

2.7 key(重要)

执行查询语句时MySQL实际会使用到的索引。如果MySQL实际没有使用索引,则此列为NULL。

2.8 key_len (重要)

执行查询语句时实际用到的索引按照字节计算的长度值,可以通过此字段计算MySQL实际上使用了复合索引中的多少字段。如果key列值为NULL,则key_len列值也为NULL。

2.9 ref

数据表中的哪个列或者哪个常量用来和key列中的索引做比较来检索数据。如果此列的值为func,则说明使用了某些函数的结果数据与key列中的索引做比较来检索数据。

2.10 rows (重要)

查询数据时必须查找的数据行数,当数据表的存储引擎为InnoDB时,值为MySQL的预估值。

2.11 Extra

在执行查询语句时额外的详细信息

  • Using index:表示MySQL将使用覆盖索引,这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。
  • Using index condition:在5.6版本后加入的新特性索引下推(Index Condition Pushdown,ICP),在索引遍历过程中,对索引中包含的字段先做判断(即使该字段没有使用到索引),直接过滤掉不满足条件的记录,减少回表次数。
  • Using where:意味着MySQL服务器将在存储引擎检索行后再进行过滤。就是先通过索引读取整行数据,再按 WHRER条件进行检查,符合就留下,不符合就丢弃。查询的列未被索引覆盖。
  • Using temporary:MySQL需要创建一张临时表来中间结果并进一步处理,比如union、group by、distinct等,出现这种情况一般是要进行优化的,首先是想到用索引来优化。
  • Using filesort:MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行,即filesort(文件排序)。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。filesort有两种,一种是内存排序,一种是磁盘排序,无法得知。
  • Distinct: 一旦MySQL找到了与行相联合匹配的行,就不再搜索了,常见于关联查询。
  • No tables used:Query语句中使用from dual 或不含任何from子句。
  • Using join buffer:使用了连接缓存,join语句用到了缓冲区。

到此这篇关于Mysql中explain命令返回参数的具体使用的文章就介绍到这了,更多相关Mysql explain返回参数内容请搜索编程客栈(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)! 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql中explain命令返回参数的具体使用

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

下载Word文档

猜你喜欢

Mysql中explain命令返回参数的具体使用

目录1. explain命令是什么东西?2.explain命令返回列解读explain 是mysql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要,这篇文章主要介绍了MySql e
Mysql中explain命令返回参数的具体使用
2024-09-09

MySQL binlog_ignore_db 参数的具体使用

前言: 经过前面文章学习,我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、show等)。注意默认情况下会记录所有库的操作,那么如果我们有另类需求,比如说只让某个库记录 binglog
2022-05-10

Linux中history命令的具体使用方法

这篇文章主要介绍“Linux中history命令的具体使用方法”,在日常操作中,相信很多人在Linux中history命令的具体使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中history
2023-06-13

linux中talk命令参数的使用方法

这篇文章主要介绍“linux中talk命令参数的使用方法”,在日常操作中,相信很多人在linux中talk命令参数的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中talk命令参数的使用方法
2023-06-17

在SQL Server中使用命令调用SSIS包的具体方法

在SQL Server中可以使用dtexec命令运行SSIS包(2005以上版本),当然也可以通过系统过程:xp_cmdshell调用dtexec运行SSIS包
2022-11-15

Python中命令行参数argparse模块的使用

argparse是python自带的命令行参数解析包,可以用来方便的服务命令行参数。本文将通过示例和大家详细讲讲argparse的使用,需要的可以参考一下
2023-02-01

linux 中的ls命令参数详解及ls命令的使用实例

一、ls命令参数详解可以通过阅读 ls 的说明书页(man ls)来获得选项的完整列表。 -a ? 全部(all)。列举目录中的全部文件,包括隐藏文件(.filename)。位于这个列表的起首处的 .. 和 . 依次是指父目录和你的当前目录
2022-06-04

如果我们使用不带参数的 UNIX_TIMESTAMP() 函数,MySQL 将返回什么?

在这种情况下,MySQL 返回当前日期和时间的 Unix 时间戳。因此,我们可以说不使用参数与使用 NOW() 作为 UNIX_TIMESTAMP() 函数的参数相同。例如,如果我们运行没有值且使用 NOW( 的 UNIX_TIMESTAM
2023-10-22

Linux系统中历史命令的具体使用方法是什么

这篇文章给大家介绍Linux系统中历史命令的具体使用方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当你在Linux中执行命令之后,你所执行的命令都会在历史命令中记录,合理的使用历史命令可以不必每次都输入命令。
2023-06-28

使用js获取url中的参数并返回一个对象方式

这篇文章主要介绍了使用js获取url中的参数并返回一个对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-17

在Linux中如何使用bd命令快速返回到特定的父目录

这篇文章主要介绍了在Linux中如何使用bd命令快速返回到特定的父目录,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是 bd 命令?bd 命令允许用户快速返回 Linux
2023-06-16

怎么在CentOS中使用上一条命令的所有参数

这篇文章将为大家详细讲解有关怎么在CentOS中使用上一条命令的所有参数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.使用上一条命令的所有参数方法:!*例子:如果我对hello.txt和
2023-06-10

docker 使用mysqldump命令备份导出项目中的mysql数据

下图为镜像重命名后的镜像名为uoj,现在要把这个镜像中的mysql导出 运行如下命令: docker exec -it uoj mysqldump -uroot -proot app_uoj233 >/data/database_bak/app_uoj233.
docker 使用mysqldump命令备份导出项目中的mysql数据
2019-05-10

编程热搜

目录