做 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. Cow Exhibition POJ - 2184

    题目地址:https://vjudge.net/problem/POJ-2184 下面的解释是从一个大佬那搬来的,讲的很清楚题意:给定一些奶牛,每个牛有s和f两个属性值,有正有负,要求选出一些牛,使得 ...

  2. docker-compose exec时 出现"fork/exec /proc/self/exe: no such file or directory" 报错

    问题:跟往常一样执行docker-compos exec redis sh时出现如下错误,而容器是运行状态中. # docker-compose exec redis sh rpc error: co ...

  3. [USACO09OCT]Invasion of the Milkweed】乳草的侵占-C++

    Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高 ...

  4. Leetcode solution 291: Word Pattern II

    Problem Statement Given a pattern and a string str, find if str follows the same pattern. Here follo ...

  5. 人事管理系统为你解剖JSP

    人事管理系统为你解剖JSP 前言: 之前写过两篇学习JSP的博客,<Java匹马行天下之JavaWeb核心技术——JSP>https://www.cnblogs.com/zyx110/p/ ...

  6. Android studio 混淆打包安装后报错NullPointerException int java.util.List.size()

    菜鸟的我,尝试混淆打包app...打包之前没有什么问题,混淆打包之后遇到各种问题.首先,感谢原博主的分享.解决了我的问题.谢谢. 原文地址:http://blog.csdn.net/tou_star/ ...

  7. sql注入篇1

    一.前言 学习了感觉很久的渗透,总结一下sql注入,系统整理一下sql注入思路. 二.关于sql注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到 ...

  8. 【MySQL】(七)事务

    我的个人博客 http://www.haxianhe.com/ 数据库系统引入事务的主要目的:事务会把数据库从一种状态转换为另一种一致状态.在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所 ...

  9. C#中Tuple的使用

    鉴于MSDN上面的机器翻译实在太烂,还是自己翻译吧,虽然麻烦了点(-_-). 定义:元组是具有 特定数量和序列 的元素 的数据结构  (注意断句哈!) 元组通常有四种使用方式︰ 一.表示一组数据 例如 ...

  10. spark 源码分析之十九 -- Stage的提交

    引言 上篇 spark 源码分析之十九 -- DAG的生成和Stage的划分 中,主要介绍了下图中的前两个阶段DAG的构建和Stage的划分. 本篇文章主要剖析,Stage是如何提交的. rdd的依赖 ...