做 MySQL 查询优化遇到明明建了索引查询仍然很慢,看这个 SQL 的执行计划,看它到底有没有用到索引,执行的具体情况。我们可以用 EXPLAIN 命令查看 SQL 的执行计划,SQL 优化的重要性和执行计划密切相关。

EXPLAIN 能够让我们了解到MySQL将如何执行出现在 EXPLAIN 之后的那条 SQL 语句,例如:

EXPLAIN SELECT score.* FROM score INNER JOIN grade_event

ON score.event_id = grade.event_id AND grad_event.event_id = 14;

在MySQL 5.6.3之前,该语句必须为SELECT。自MySQL5.6.3起,该语句可以为 SELECT、DELETE、INSERT或UPDATE。

在 EXPLAIN 关键字之后,可以指定一个可选的指示器,指明要产生的输出类型:

例如:

会输出如图内容,这些字段的意思都是啥,是今天这篇文章的重点。

EXTENDED

选项将使 EXPLAIN 语句生成更多的执行计划信息。在 EXPLAIN 语句执行完毕之后立刻执行 SHOW WARNINGS 语句可以查看这些信息。

FORMAT

表明的是用“传统”格式(默认)产生输出,还是用JSON格式产生输出。JSON输出包含了扩展的和可用的分区信息。此选项是在MySQL5.6.5里引入的。

id

这个输出行所对应的的 select 语句的ID 编号。如果语句包含子查询,或该语句中使用了 UNION,那么语句汇总可以有多个 select 子句。

select_type

这个输出行所对应的的 select 语句类型如下表所示。

类型 含义
SIMPLE 不带UNION或子查询部分的SELECT子句
PRIMARY 最外层或最左侧的SELECT语句
UNION UNION里的第二条或最后的SELECT子句
DEPENDENT UNION 和UNION相似,但需要依赖于某个外层查询
UNION RESULT UNION的结果
SUBQUERY 子查询中的第一个SELECT子句
DEPENDENT SUBQUERY  和SUBQUERY相似,但需要依赖于某个外层查询
DERIVED FROM子句里的子查询
UNCASHEABLE SUBQUERY 无法缓存的子查询结果
UNCASHEABLE UNION 无法缓存的子查询UNION的第二条或随后的SELECT子句

table

输出行引用的那个表。

partitions

将要使用的分区。只有出现PARTITIONS选项时才显示这列。对于非分区表,这个值为NULL。

type

MySQL将执行的连续类型。这些类型(从优到劣)包括system const eq_ref ref ref_or_null index_merge unique_subquery index_subquery range index和ALL。排在前面的类型有更强的限制性,这意味着MySQL在检索的过程中检查的行会相对少一些。

possible_keys

MySQL认为在 名称出现在table 列里的那个表里查找行时可能会用到索引。如果这个输出列里是NULL,则表明没有找到索引。

key

MySQL在指定表里查找行时实际用到的索引。(如果MySQL使用了 index_merge 连续类型,这里可能会列出几个键,因为优化器会使用几个索引来处理查询。)如果这个输出里的值时NULL,则表明没有再该表里找到这样的索引。

key_len

实际使用的索引的长度。若MySQL会使用索引的最左前缀,则此数字可能会小于全文索引行的长度。

ref

MySQL 用来与索引值进行比较的值。单次 const 或 ‘???’ 表示的是对常数进行比较,若是某个列的名称,则表示逐个比较列。

rows

MySQL 为完成查询而需要在表里检查的行的估计百分比。这个值输出的值的乘积就是索引表必须检查的行的各种可能的组合的估计值。

filtered

它指的是将于前面的表进行连接的行的估计百分比,若存在 EXTENDED 选项,则会显示此列。

Extra

其他执行计划相关的信息。这个值或者为空白,或者包含一个或多个下面这样的值。

  • Using filesort 需要将索引值写到文件中并且排序,以便安排顺序检索相关行。
  • Using index MySQL 可以不必检查数据行,只使用索引信息就能检索表信息。
  • Using temporary 利用SELECT 语句只能怪 WHERE 子句里 的信息查询行。

此外,还有很多其他的值并未列在这里。与Extra 值有关的更多信息请MySQL-EXPLAIN执行计划Extra解释。

MySQL-EXPLAIN执行计划字段解释的更多相关文章

  1. MySQL性能分析, mysql explain执行计划详解

    MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...

  2. Mysql explain执行计划

    EXPLAIN(小写explain)显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. EXPLAIN + sql语句可以查看mysql的执行 ...

  3. [MySQL] explain执行计划解读

    Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...

  4. 网站优化—mysql explain执行计划

    explain执行计划 简介MySQL调优: 先发现问题(慢查询,profile) 对于使用索引和没有使用索引,了解到索引可以快速去查找数据 了解什么是索引(索引是排好序的快速查找的数据结构) 索引的 ...

  5. MySql——Explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  6. 【夯实Mysql基础】mysql explain执行计划详解

    原文地址   1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A ...

  7. mysql explain执行计划详解

      1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A:simp ...

  8. 【转】mysql explain执行计划详解

      1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A:simp ...

  9. mysql explain 执行计划详解

    1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A:simple ...

随机推荐

  1. Hash碰撞概率

    计算Hash冲突的概率 虽然已经很多可以选择的Hash函数,但创建一个好的Hash函数仍然是一个活跃的研究领域.一些Hash函数是快的,一些是慢的,一些Hash值均匀地分布在值域上,一些不是.对于我们 ...

  2. Linux命令学习-tail命令

    Linux中,tail命令的全称就是tail,主要用于监控日志文件. 对于一个正在运行应用来说,其对应的log日志文件肯定是在不断的更新,此时,便可通过tail命令来动态显示日志文件的内容.假设当前目 ...

  3. 文档管理器 PDFelement Pro v6.8.4.3921 精简绿色版

    下载地址:点我 PDFelement是PDF全套解决方案专家,专注于PDF的创建.编辑.转换.标注.保护.管理.水印.压缩.签名等功能.Wondershare PDFelement是款国产优秀的专业P ...

  4. 【小家Spring】聊聊Spring中的数据绑定 --- BeanWrapper以及内省Introspector和PropertyDescriptor

    #### 每篇一句 > 千古以来要饭的没有要早饭的,知道为什么吗? #### 相关阅读 [[小家Spring]聊聊Spring中的数据转换:Converter.ConversionService ...

  5. CentOS6.5安装Oracle 12c

    CentOS6.5 安装 ORACLE 12c步骤 Oracle官网下载oracle12c安装包,解压软件:unzip linuxx64_12201_database.zip 一.创建用户和组#gro ...

  6. [原创]wireshark&xterm安装、配置和使用

    --wireshark && xterm--一.安装wireshark: #apt-get install wireshark二.启动wireshark: #wireshark 或者 ...

  7. 鸟哥的Linux私房菜笔记第六章(二)

    文件内容查询 直接查询文件内容 查阅一个文件的内容可以使用指令cat/tac/nl. # [cat|tac|nl] 文件 区别: 1.cat是直接把文件内容输出到屏幕上,并且从第一行开始输出到末行 2 ...

  8. Python连载25-函数tell&write&writeline$&持久化

    一. 1.连续打印举例 #打开文件,三个字符一组读出来内容,然后显示在屏幕上,每读一次,停一秒 import time with open(r"test01.txt",'r') a ...

  9. .Net微信网页开发之使用微信JS-SDK自定义微信分享内容

    第一步.微信JS-SDK的使用步骤,配置信息的生成获取讲解: 关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token ...

  10. linux初学者-延迟及定时任务篇

    linux初学者-延迟及定时任务篇 在linux系统的学习工作中,南面会遇到需要延迟进行的任务和需要定时去完成的任务,就像手机的闹钟一样,这时候就需要用到linux系统当中的系统延迟和定时任务的设置了 ...