服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|

服务器之家 - 数据库 - Mysql - MYSQL 性能分析器 EXPLAIN 用法实例分析

MYSQL 性能分析器 EXPLAIN 用法实例分析

2021-01-19 16:50人生如初见_张默 Mysql

这篇文章主要介绍了MYSQL 性能分析器 EXPLAIN 用法,结合实例形式分析了MYSQL 性能分析器 EXPLAIN 基本功能、使用方法及操作注意事项,需要的朋友可以参考下

本文实例讲述了mysql 性能分析器 explain 用法。分享给大家供大家参考,具体如下:

使用方法:

?
1
explain select * from user;

环境和数据准备

?
1
2
3
4
5
6
7
8
-- 查看 mysql 版本
select version();
 
-- mysql 提供什么存储引擎
show engines;
 
-- 查看默认存储引擎
show variables like '%storage_engine%';

 输出结果:

MYSQL 性能分析器 EXPLAIN 用法实例分析

 id:输出的是整数,用来标识整个 sql 的执行顺序。id 如果相同,从上往下依次执行id不同;id 值越大,执行优先级越高,越先被执行;如果行引用其他行的并集结果,则该值可以为null

select_type:[查询类型]

 

simple:简单的 select 查询,没有 union 或者子查询,包括单表查询或者多表 join 查询

primary: 最外层的 select 查询,常见于子查询或 union 查询 ,最外层的查询被标识为 primary

union:union 操作的第二个或之后的 select,不依赖于外部查询的结果集(外部查询指的就是 primary 对应的 select)

dependent union:union 操作的第二个或之后的 select,依赖于外部查询的结果集

union result:union 的结果(如果是 union all 则无此结果)

subquery:子查询中的第一个 select 查询,不依赖于外部查询的结果集

dependent subquery:子查询中的第一个select查询,依赖于外部查询的结

derived:派生表(临时表),常见于 from 子句中有子查询的情况

注意:mysql5.7 中对 derived table 做了一个新特性,该特性允许将符合条件的 derived table 中的子表与父查询的表合并进行直接join,从而简化简化了执行计划,同时也提高了执行效率;默认情况下,mysql5.7 中这个特性是开启的,所以默认情况下,上面的 sql 的执行计划应该是这样的

materialized:被物化的子查询,mysql5.6 引入的一种新的 select_type,主要是优化 from 或 in 子句中的子查询,更多详情请查看:optimizing subqueries with materialization

uncacheable subquery:对于外层的主表,子查询不可被缓存,每次都需要计算

uncacheable union:类似于 uncacheable subquery,只是出现在 union 操作中

simplle、primary、subquery、derived 这 4 个在实际工作中碰到的会比较多,看得懂这 4 个就行了,至于其他的,碰到了再去查资料就好了

table:显示了对应行正在访问哪个表(有别名就显示别名),还会有 <union2,3> 、 <subquery2> 、 <derived2> (这里的 2,3、2、2 指的是 id 列的值)类似的值

partitions:查询进行匹配的分区,对于非分区表,该值为null。大多数情况下用不到分区,所以这一列我们无需关注

type:

 

关联类型或者访问类型,它指明了 mysql 决定如何查找表中符合条件的行,这是我们判断查询是否高效的重要依据,完整介绍请看:explain-join-types

system:该表只有一行(=系统表),是 const 类型的特例

const:确定只有一行匹配的时候,mysql 优化器会在查询前读取它并且只读取一次,速度非常快。用于 primary key 或 unique 索引中有常亮值比较的情形

eq_ref:对于每个来自于前面的表的行,从该表最多只返回一条符合条件的记录。当连接使用的索引是 primary key 或 unique not null 索引时使用,非常高效

ref:索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非 unique 或非 primary key, 或者是使用了最左前缀规则索引的查询,换句话说,如果 join 不能基于关键字选择单个行的话,则使用ref

fulltext:当使用全文索引时会用到,这种索引一般用不到,会用专门的搜索服务(solr、elasticsearch等)来替代

ref_or_null:类似ref,但是添加了可以专门搜索 null 的行

MYSQL 性能分析器 EXPLAIN 用法实例分析

这个是有前提条件的,前提为 weapon 列有索引,且 weapon 列存在  null 

index_merge:该访问类型使用了索引合并优化方法

MYSQL 性能分析器 EXPLAIN 用法实例分析

这个同样也是有条件的, id 列和 weapon 列都有单列索引。如果出现 index_merge,并且这类 sql 后期使用较频繁,可以考虑把单列索引换为组合索引,这样效率更高

unique_subquery:类似于两表连接中被驱动表的 eq_ref 访问方式,unique_subquery 是针对在一些包含 in 子查询的查询语句中,如果查询优化器决定将 in 子查询转换为 exists 子查询,而且子查询可以使用到主键或者唯一索引进行等值匹配时,则会使用 unique_subquery

index_subquery:index_subquery 与 unique_subquery类似,只不过访问子查询中的表时使用的是普通的索引

range:使用索引来检索给定范围的行,当使用 =、<>、>、>=、<、<=、is null、<=>、between 或者 in 操作符,用常量比较关键字列时,则会使用 rang,前提是必须基于索引,也就是 id 上必须有索引

index:当我们可以使用索引覆盖,但需要扫描全部的索引记录时,则会使用 index;进行统计时非常常见

all:我们熟悉的全表扫描

possible_keys:展示在这个 sql 中,可能用到的索引有哪些,但不一定在查询时使用。若为空则表示没有可以使用的索引,此时可以通过检查 where 语句看是否可以引用某些列或者新建索引来提高性能

key:展示这个 sql 实际使用的索引,如果没有选择索引,则此列为null,要想强制 mysql 使用或忽视 possible_keys 列中的索引,在查询中使用 force index、use index 或者i gnore index

key_len:展示 mysql 决定使用的键长度(字节数)。如果 key 是 null,则长度为 null。在不损失精确性的情况下,长度越短越好

ref:展示的是与索引列作等值匹配的东东是个啥,比如只是一个常数或者是某个列。它显示的列的名字(或const),此列多数时候为 null

rows:展示的是 mysql 解析器认为执行此 sql 时预计需要扫描的行数。此数值为一个预估值,不是具体值,通常比实际值小

filtered:展示的是返回结果的行数所占需要读到的行(rows 的值)的比例,当然是越小越好啦

extra:

 

表示不在其他列但也很重要的额外信息。取值有很多,我们挑一些比较常见的过一下

using index:表示 sql 使用了使用覆盖索引,而不用回表去查询数据,性能非常不错

using where:表示存储引擎搜到记录后进行了后过滤(post-filter),如果查询未能使用索引,using where 的作用只是提醒我们 mysql 要用 where 条件过滤结果集

using temporary:表示 mysql 需要使用临时表来存储结果集,常见于排序和分组查询

using filesort:表示 mysql 无法利用索引直接完成排序(排序的字段不是索引字段),此时会用到缓冲空间(内存或者磁盘)来进行排序;一般出现该值,则表示 sql 要进行优化了,它对 cpu 的消耗是比较大的

impossible where:查询语句的where子句永远为 false 时将会提示该额外信息

当然还有其他的,不常见,等碰到了大家再去查吧!!!

希望本文所述对大家MySQL数据库计有所帮助。

原文链接:https://blog.csdn.net/qq_42176520/article/details/103251935

延伸 · 阅读

精彩推荐
  • MysqlMySQL统计函数GROUP_CONCAT使用陷阱分析

    MySQL统计函数GROUP_CONCAT使用陷阱分析

    这篇文章主要介绍了MySQL统计函数GROUP_CONCAT使用中的陷阱,结合实例形式分析了GROUP_CONCAT用于统计时的长度限制问题与相关注意事项,需要的朋友可以参考下...

    yiluoAK_473572020-06-15
  • MysqlMySQL中的binlog相关命令和恢复技巧

    MySQL中的binlog相关命令和恢复技巧

    这篇文章主要介绍了MySQL中的binlog相关命令和恢复技巧,需要的朋友可以参考下 ...

    MYSQL教程网3852020-03-26
  • MysqlMysql服务器的启动与停止(二)

    Mysql服务器的启动与停止(二)

    三、 停止 服务器 要手工 启动 服务器,使用MySQLadmin: %mysqladminshutdown 要自动停止服务器,你不需做特别的事情。BSD系统一般通过向进程发一个TERM信号停止...

    Mysql教程网4342019-10-15
  • MysqlLinux下彻底卸载mysql详解

    Linux下彻底卸载mysql详解

    如何在Linux下彻底的卸载MySQL数据库呢? 下面这篇文章就给大家总结、整理了一下在Linux平台下彻底卸载MySQL的方法。 文中通过图文及示例代码介绍的很详细...

    daisy3322020-07-01
  • MysqlMYSQL 完全备份、主从复制、级联复制、半同步小结

    MYSQL 完全备份、主从复制、级联复制、半同步小结

    这篇文章主要介绍了MYSQL 完全备份、主从复制、级联复制、半同步小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看...

    看头像2592020-09-24
  • MysqlMySQL常用类型转换函数总结(推荐)

    MySQL常用类型转换函数总结(推荐)

    这篇文章主要介绍了MySQL常用类型转换函数总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    其实我是一演员2732020-09-22
  • MysqlMySQL插入时间差八小时问题的解决方法

    MySQL插入时间差八小时问题的解决方法

    这篇文章主要给大家介绍了关于MySQL插入时间差八小时问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价...

    lankeren3692020-12-21
  • MysqlMySQL5.7缺少my.ini文件的解决方法

    MySQL5.7缺少my.ini文件的解决方法

    my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的。这篇文章主要介绍了MySQL5.7缺少my.ini文件的解决方法,需要的朋友可以参考下...

    半壁灯的博客3962020-08-27