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

EXPLAIN + sql语句可以查看mysql的执行计划。

其中:

id:

1、是一组数字,表示查询中执行select子句或操作表的顺序。

2、如果id相同,则执行顺序从上至下。

3、如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行。

4、所有组中,id越大,优先级越高,越容易执行。

select_type:(表示查询中每个select子句的类型(简单OR复杂),有以下几种)有simple,primary,subquery,derived(衍生),union,unionresult。

1、SIMPLE:查询中不包含子查询或者UNION

2、PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY。

3、SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询被标记为SUBQUERY。

4、DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生)。

5、UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;

6、derived:若union在from子句的子查询中,外层的select被标记成derived。

7、union result:从union表获取结果的select被标记成union result。

table:显示这一行的数据是关于哪张表的

type:(表示MySQL在表中找到所需行的方式,又称“访问类型”,常见有以下几种all,index,range,ref,eq_ref,const,system,NULL)

  ALL:Full Table Scan, MySQL将进行全表扫描。

  index:full index scan,index与ALL区别为index类型只遍历索引树。

  range:range Index Scan,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询;

  ref:非唯一性索引扫描,返回匹配摸个单独值的所有行。常见于使用非唯一索引或唯一索引的非唯一前缀进行的查找;

  eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

  const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量

  NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引

possiblekeys:

2种意思:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

possiblekey表示能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引被列出,但不一定被查询使用。

key:

1、key表示查询时使用的索引。若查询中使用了覆盖索引,则该索引仅出现在key中举个例子

employee中gender上有一个索引。使用如下语句

EXPLAIN SELECT gender from employees

则结果如下:1  SIMPLE  employees  index  IND_GEN  1  300695  Using index

EXPLAIN SELECT first_name from employees

则结果如下  1  SIMPLE  employees  ALL  300695

keylen:

keylen表示索引所使用的字节数,可以通过该列结算查询中使用的索引长度

ref:

ref表示上述表的链接匹配条件,即哪些列或常量可被用于查找索引列上的值。

rows:

rows表示根据mysql表统计信息及索引选用情况,估算找到所需记录要读取的行数。

extra:

extra表示不在其他列并且也很重要的额外信息。

using index表示在相应的select中使用了覆盖索引。

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

using temporay表示用临时表来存储结果集,常见于排序和分组查询。

usingfilesort,mysql中无法用索引完成的排序成为文件排序。

关于覆盖索引的一些概念如下:

MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引称为 覆盖索引(Covering Index) 如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降

mysq的执行计划有一定局限性直接引用了

•EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

•EXPLAIN不考虑各种Cache

•EXPLAIN不能显示MySQL在执行查询时所作的优化工作

•部分统计信息是估算的,并非精确值

•EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划

Mysql explain执行计划的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. mysql explain执行计划详解

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

  7. MYSQL EXPLAIN执行计划命令详解(支持更新中)

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所 ...

  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. jquery-ajax-php(内容点赞并进行cookie限制实现)

    1.模板页html例如以下: 2.模板页的jquery里的ajax实现例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T ...

  2. Hibernate- QBC离线查询

    package com.gordon.test; import java.util.List; import org.hibernate.Criteria; import org.hibernate. ...

  3. anroid 广播

    广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroa ...

  4. esayUI实践的一些体会

    1.如何在页面中使用 easy ui ? 引入 四个文件 <!-- 引入easy ui --> <link rel="stylesheet" type=" ...

  5. 用isNaN函数来判断是否只能输入正负数字

    isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果, 以判断它们表示的是否是合法的数字.当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的 ...

  6. 关于Unity中stretch的分开使用、预制体、Scroll View的UI节点

    一.上次讲的菊花的四个花瓣,只讲了四个花瓣和在一起的时候的作用,现在是分开的菊花的四个花瓣的作用 1.创建一个Canvas2.对Canvas进行初始化3.创建一个Image的UI节点作为Canvas的 ...

  7. ubuntu12.04开启虚拟机的unity模式

    终端中输入: sudo add-apt-repository ppa:gnome3-team/gnome3 sudo apt-get update sudo apt-get install gnome ...

  8. oop-Inheritance & Polymorphism

    本文主要作为java学习笔记,方便以后查看,大部分内容都源于以下网站: http://www.ntu.edu.sg/home/ehchua/programming/index.html#Game 本文 ...

  9. JS中document对象详解

    转自:http://www.cnblogs.com/andycai/archive/2010/06/29/1767351.html 对象属性 document.title //设置文档标题等价于HTM ...

  10. c++ double float 数值比较

    浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基 ...