前言:

这篇文章主要讲 explain 如何使用,还有 explain 各种参数概念,之后会讲优化

一、Explain 用法

模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

语法:Explain + SQL 语句;

如:Explain select * from user; 会生成如下 SQL 分析结果,下面详细对每个字段进行详解

二、id

是一组数字,代表多个表之间的查询顺序,或者包含子句查询语句中的顺序,id 总共分为三种情况,依次详解

  • id 相同,执行顺序由上至下
  • id 不同,如果是子查询,id 号会递增,id 值越大优先级越高,越先被执行
  • id 相同和不同的情况同时存在

三、select_type

select_type 包含以下几种值

  • simple
  • primary
  • subquery
  • derived
  • union
  • union result

simple

简单的 select 查询,查询中不包含子查询或者 union 查询

primary

如果 SQL 语句中包含任何子查询,那么子查询的最外层会被标记为 primary

subquery

在 select 或者 where 里包含了子查询,那么子查询就会被标记为 subQquery,同三.二同时出现

derived

在 from 中包含的子查询,会被标记为衍生查询,会把查询结果放到一个临时表中

union / union result

如果有两个 select 查询语句,他们之间用 union 连起来查询,那么第二个 select 会被标记为 union,union 的结果被标记为 union result。它的 id 是为 null 的

四、table

表示这一行的数据是哪张表的数据

五、type

type 是代表 MySQL 使用了哪种索引类型,不同的索引类型的查询效率也是不一样的,type 大致有以下种类

  • system
  • const
  • eq_ref
  • ref
  • range
  • index
  • all

system

表中只有一行记录,system 是 const 的特例,几乎不会出现这种情况,可以忽略不计

const

将主键索引或者唯一索引放到 where 条件中查询,MySQL 可以将查询条件转变成一个常量,只匹配一行数据,索引一次就找到数据了

eq_ref

在多表查询中,如 T1 和 T2,T1 中的一行记录,在 T2 中也只能找到唯一的一行,说白了就是 T1 和 T2 关联查询的条件都是主键索引或者唯一索引,这样才能保证 T1 每一行记录只对应 T2 的一行记录

举个不太恰当的例子,EXPLAIN SELECT * from t1 , t2 where t1.id = t2.id

ref

不是主键索引,也不是唯一索引,就是普通的索引,可能会返回多个符合条件的行。

range

体现在对某个索引进行区间范围检索,一般出现在 where 条件中的 between、and、、in 等范围查找中。

index

将所有的索引树都遍历一遍,查找到符合条件的行。索引文件比数据文件还是要小很多,所以比不用索引全表扫描还是要快很多。

all

没用到索引,单纯的将表数据全部都遍历一遍,查找到符合条件的数据

六、possible_keys

此次查询中涉及字段上若存在索引,则会被列出来,表示可能会用到的索引,但并不是实际上一定会用到的索引

七、key

此次查询中实际上用到的索引

八、key_len

表示索引中使用的字节数,通过该属性可以知道在查询中使用的索引长度,注意:这个长度是最大可能长度,并非实际使用长度,在不损失精确性的情况下,长度越短查询效率越高

九、ref

显示关联的字段。如果使用常数等值查询,则显示 const,如果是连接查询,则会显示关联的字段。

  • tb_emp 表为非唯一性索引扫描,实际使用的索引列为 idx_name,由于 tb_emp.name='rose'为一个常量,所以 ref=const。
  • tb_dept 为唯一索引扫描,从 sql 语句可以看出,实际使用了 PRIMARY 主键索引,ref=db01.tb_emp.deptid 表示关联了 db01 数据库中 tb_emp 表的 deptid 字段。

十、rows

根据表信息统计以及索引的使用情况,大致估算说要找到所需记录需要读取的行数,rows 越小越好

十一、extra

不适合在其他列显示出来,但在优化时十分重要的信息

using fileSort(重点优化)

俗称 " 文件排序 " ,在数据量大的时候几乎是“九死一生”,在 order by 或者在 group by 排序的过程中,order by 的字段不是索引字段,或者 select 查询字段存在不是索引字段,或者 select 查询字段都是索引字段,但是 order by 字段和 select 索引字段的顺序不一致,都会导致 fileSort

using temporary(重点优化)

使用了临时表保存中间结果,常见于 order by 和 group by 中。

USING index(重点)

表示相应的 select 操作中使用了覆盖索引(Coveing Index),避免访问了表的数据行,效率不错! 如果同时出现 using where,表明索引被用来执行索引键值的查找;如果没有同时出现 using where,表面索引用来读取数据而非执行查找动作。

Using wher

表明使用了 where 过滤

using join buffer

使用了连接缓存

impossible where

where 子句的值总是 false,不能用来获取任何元组

select tables optimized away

在没有 GROUPBY 子句的情况下,基于索引优化 MIN/MAX 操作或者 对于 MyISAM 存储引擎优化 COUNT(*)操作,不必等到执行阶段再进行计算, 查询执行计划生成的阶段即完成优化。

distinct

优化 distinct,在找到第一匹配的元组后即停止找同样值的工作

作者:IT老哥

链接:https://juejin.im/post/5f0535dae51d45348d39ffbe

explain的用法_这次是真拯救了我,MySQL索引优化,explain讲得非常清楚了相关推荐

  1. mysql union查询_一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

  2. 一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

  3. 讲真,MySQL索引优化看这篇文章就够了

    本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL--索引基础 首先,我们将从索引基础开始介绍一下什么 ...

  4. mysql 表与表之间的条件比对_十六年老司机笔记:MySQL性能优化之必备技能

    导读:MySQL 是目前广泛使用的数据库,但很多项目对 MySQL 的使用仍然存在欠优化的地方,本文根据作者长年的经验提出了 MySQL 数据库优化方法,这些方法是否适合你的项目?还有哪些优化方法值得 ...

  5. MySQL——索引与EXPLAIN

    前言 本文内容主要参考自<高性能MySQL>第5章以及<MySQL DBA 修炼之道>书中的第三章,算是原书的实践与补充. 上次主要讲了MySQL的基本操作,这次来谈谈索引与E ...

  6. mysql单列索引和多列索引_浅谈MySQL索引优化

    索引基础知识总结及常见索引优化手段 一.索引简介 什么是索引? MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以简单理解为"排好序的快速查找数据 ...

  7. left join 索引失效无条件_从零开始学数据分析-mysql索引优化方案

    接上节,执行计划还有一个重要的字段是extra,以下是出现的选项. 1.using filesort: 需要一次额外的查询或者排序,性能开销大.常见于order by语句中. create 对于单索引 ...

  8. mysql update 几万 非常慢_面试官:谈谈你对mysql索引的认识?

    引言 大家好,我渣渣烟.我曾经写过一篇<面试官:讲讲mysql表设计要注意啥>,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mys ...

  9. mysql 唯一索引_面试官:谈谈你对mysql索引的认识?

    引言 大家好,我渣渣烟.我曾经写过一篇<面试官:讲讲mysql表设计要注意啥>,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mys ...

最新文章

  1. React组件设计实践总结05 - 状态管理
  2. 【nginx】从主页搭建看nginx常用配置
  3. JavaScript 下载大文件解决方案(Blob+OjbectURL)
  4. 为record类型自定义Equals方法
  5. 51单片机学习笔记之定时器程序设计
  6. SQL Transcation的一些总结
  7. 数字频率计的verilog实现
  8. python 安装包列表导出到 txt
  9. [PHP开发必备] -- 小巧强悍的MYSQL-Front中文版使用教程,附最新版下载地址
  10. xp系统怎么进pe修改计算机名,U盘装xp_教您怎样用u盘装xp系统
  11. 常用编程语言介绍和特点
  12. MT4 获取当前订单的开单价格
  13. spark 概述与安装
  14. 罗技G304接收器无反应问题,现象及解决方法
  15. 【设计模式】我对设计模式的C语言解读(上)
  16. Bilibili支持了AV1编码,关于AV1编码你知道吗?
  17. MATLAB 学习笔记:1 定义和使用矩阵
  18. 紫光展锐:大破大立 做数字世界的生态承载者
  19. windows 10系统下Nexus的下载安装
  20. 2021-2027全球与中国接触角测量仪市场现状及未来发展趋势

热门文章

  1. springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法
  2. java 下面的while语句退出时_java 下面的while语句退出时
  3. spss聚类分析_SPSS实践:常用聚类分析方法详解
  4. 力扣349. 两个数组的交集(JavaScript)
  5. linux终端运行w3m,linux shell浏览器,终端浏览器w3m参考参数
  6. 列注释_机器学习 Pandas 08:进阶 前09题 ( 带答案、注释 )
  7. 计算机组成原理第四版蒋本珊课件_2020北理计算机考研813回忆(刚考完新鲜出炉)...
  8. python逐行读取txt文件readline_Python - 无法读取整个.txt文件:.readlines错误?
  9. 抗滑桩初始弹性系数计算_抗滑桩配筋计算.docx
  10. php只获取来源域名不需要参数,在php中获取域名(不是子域)