文章目录

  • 介绍
  • 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:使用聚合函数访问索引字段

MySQL的explain工具介绍相关推荐

  1. MySQL管理常用工具介绍

    1.mysql 该mysql不是指mysql服务,而是指mysql的客户端工具.  -e选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本, 这种方式尤其 ...

  2. MySql优化神器 Explain工具介绍

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈.在select语句之前增加explaion关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息, ...

  3. 转 MySQL问题排查工具介绍

    原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...

  4. MySql索引优化及Explain工具使用

    更多内容请浏览本人博客 explain 工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,My ...

  5. mysql 索引分析工具_Mysql:性能分析以及Explain工具的使用

    ---恢复内容开始--- 1.介绍 Explain工具是用来分析sql语句性能的工具,他会显示出Mysql内部解析语句的状况 使用方法: explain+sql语句 例如 2.字段分析 一.ID字段 ...

  6. MySQL自带工具使用介绍

    MySQL自带工具使用介绍: 1)mysql命令:mysql命令事是使用最多的命令工具了,为用户提供了一个命令行接口来操作管理MySQL的服务器. 命令格式: Usage:mysql [OPTIONS ...

  7. MySQL数据库中导入导出方法以及工具介绍

    MySQL数据库中导入导出方法以及工具介绍 1.MySQLimport的语法介绍: mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的工具.这 ...

  8. MySQL数据库卸载+MySQL常用的图形化管理工具介绍

    MySQL数据库卸载 我们为什么需要卸载MySQL呢?可能是因为安装的时候安装出错,也可能是因为版本过低,导致一些问题没办法进行解决,所以需要卸载MySQL,重新安装最新版的MySQL. 第一步:停止 ...

  9. MYSQL EXPLAIN 工具

    目录 一.EXPLAIN 作用 二.EXPLAIN 字段简述 三.EXPLAIN 字段详述 0.数据准备 1.id 2.table 3.select_type SIMPLE PRIMARY UNION ...

最新文章

  1. 「可解释ML/3D深度学习等」Github六月最受欢迎的机器学习库来啦
  2. 【Android基础】 Launch Mode
  3. 山东财经大学python实验六答案_实验六(带答案)
  4. 一梦江湖卡在获取服务器信息,一梦江湖小技巧,不氪金,卡级玩家怎么获取资源提升修为...
  5. K-Means 聚类实例sample
  6. BZOJ 1070 修车
  7. 【招聘(深圳)】轻岁 诚聘.NET Core开发
  8. Linux IPC实践(10) --Posix共享内存
  9. oracle只有oradata恢复,如何恢复一个只有完好数据文件的数据库?
  10. 翻译pdf中的英文 python_浅谈python实现Google翻译PDF,解决换行的问题
  11. ASP.NET事件回传机制
  12. java 虚拟机内存修改_Java虚拟机内存参数设置
  13. 【工具】977- 10个实现炫酷UI设计效果的CSS生成工具
  14. 锐捷(四)交换机虚拟化(VSU)+双主机检测(BFD)的配置
  15. 我对 相对论 提出了一个 修正,名为 “K氏修正”
  16. html实现向上向下箭头,纯css实现上下左右箭头
  17. 查找统计python列表中的重复元素
  18. 用户注册信息验证功能(前端+后台)
  19. autorelease 释放池
  20. 3.Containerd容器运行时的配置浅析与知识扩充实践

热门文章

  1. 项目不能使用fn标签_无服务器,Java和FN项目的第一步
  2. java监控数据库性能_Java:GraalVM数据库流性能
  3. web编程 端口分配_以编程方式衡量分配
  4. Java中的命令设计模式
  5. 造成内存泄漏_如何造成内存泄漏
  6. java堆内存和堆外内存_Java堆空间,本机堆和内存问题
  7. 使用Envoy代理的微服务模式,第二部分:超时和重试
  8. 通过分区在Kafka中实现订单保证人
  9. javaone_JavaOne 2012:调查JVM水晶球
  10. maven依赖最佳实践_Maven最佳实践