zoukankan      html  css  js  c++  java
  • Mysql explain执行计划

    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后查看执行计划

  • 相关阅读:
    【c# 学习笔记】使用virtual和override关键字实现方法重写
    【c# 学习笔记】多态
    【c# 学习笔记】子类的初始化顺序
    mybatis入门截图二
    解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架自动封装参数的功能
    mybatis入门截图总结
    springMVC入门截图
    OA项目总结3
    修改struts2自定义标签的源代码,在原有基础上增加功能(用于OA项目权限判断,是否显示某个权限)
    ongl表达式中得到对象,调用对象方法(OA项目权限显示模块)
  • 原文地址:https://www.cnblogs.com/cang12138/p/5834627.html
Copyright © 2011-2022 走看看