如何查看MySQL执行计划

在介绍怎么查看MySQL执行计划前,我们先来看个后面会提到的名词解释:

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

EXPLAIN查看执行计划的一些局限:

  • EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
  • EXPLAIN不考虑各种Cache
  • EXPLAIN不能显示MySQL在执行查询时所作的优化工作
  • 部分统计信息是估算的,并非精确值
  • EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划
*************************** 1. row ***************************
            id: 1     select_type: SIMPLE
         table: t1
          type: ref
 possible_keys: idx_customer_no
           key: idx_customer_no
       key_len: 99
           ref: const
          rows: 1
         Extra: Using index condition; Using where 1 row in set (0.00 sec)

id:是一组数字,表示查询中执行select子句或操作表的顺序。  如果id相同,则执行顺序从上至下;  如果是子查询,id的序列号会递增,id越大则优先级越高,越先会被执行。  id如果相同,则可以认为是一组,从上往下顺序执行,所有组中,id越高,优先级越高,越容易执行。

select_type:取值有simple,primary,subquery,derived,union,unionresult

  • simple:表示查询中不包含子查询或者union
  • primary:当查询中包含任何复杂的子部分,最外层的查询被标记成primary
  • subquery:在select或where列表中包含了子查询,则子查询被标记成subquery
  • derived:在from的列表中包含的子查询被标记成derived
  • union:若第二个select出现在union后,则被标记成union,若union在from子句的子查询中,外层的select被标记成derived
  • unionresult:从union表获取结果的select被标记成union result

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

type:访问类型,表示在表中找到所需行的方式,常见的类型有all,index,range,ref,eq_ref,const,system,null性能从左至右由差至好。

  • ALL:即full table scan,mysql将遍历全表来找到所需要的行
  • index:full index scan,只遍历索引树
  • range:表示索引范围扫描,对索引的扫描开始于一点,返回匹配值域的行,常见于between,<,>的查询
  • ref:为非唯一性索引扫描,返回匹配某个单独值的所有行,常见于非唯一索引即唯一索引的非唯一前缀进行的查找。
  • eq_ref:表示唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或者唯一索引扫描。
  • const,system表示当对查询部分进行优化,并转化成一个常量时,使用这些类型访问。比如将主键置于where列表中,mysql就能把该查询置成一个常量。system是const的一个特例,当查询表中只有一行的情况下使用的是system。  null表示在执行语句中,不用查表或索引。

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

key:表示查询时使用的索引。若查询中使用了覆盖索引,则该索引仅出现在key中。

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

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

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

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

  • using index表示相应的select中使用了覆盖索引。
  • usingwhere表示存储引擎搜到记录后进行了后过滤(POST-FILTER),如果查询未能使用索引,usingwhere的作用只是提示我们mysql要用where条件过滤Z结果集。
  • using temporay表示临时表来存储结果集,常见于排序和分组查询。
  • using filesort mysql中无法用索引完成的排序成为文件排序
时间: 2024-08-07 08:49:46

如何查看MySQL执行计划的相关文章

如何查看MySQL执行计划呢?

覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引称为 覆盖索引(Covering Index) 如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降 EXPLAIN查看执行计划的一些局限: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况EXPLAIN不考虑各种CacheEXPLAIN不能显

【转】mysql执行计划介绍

原文地址:http://www.jb51.net/article/43306.htm 1.查看mysql执行计划 explain SELECT * from shippingorder where STATUS<>4; 2.执行计划包含的信息 (1).id 含义,指示select字句或操作表的顺序. eg1:id相同,执行顺序从上到下,下面的执行计划表示,先操作t1表,然后操作t2表,最后操作t3表. eg2:若存在子查询,则子查询(内层查询)id大于父查询(外层查询),先执行子查询.id越大

MySQL执行计划解读

MySQL执行计划解读 http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html MySQL执行计划解读 Explain语法 EXPLAIN SELECT -- 变体: 1. EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT -- 用于分区表

MySQL执行计划解读 转他人文章

Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT …… 用于分区表的EXPLAIN 执行计划包含的信息 id 包含一组数字,表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越

MySQL 执行计划explain详解

MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 调用EXPLAIN 在select之前添加explain,mysql会在查询上设置一个标记,当执行查询计划时,这个标记会使其返回关于执行计划中每一步的信息,而不是执行它.它会返回一行或多行信息,显示出执行计划中的每一部

MySQL执行计划 EXPLAIN参数

MySQL执行计划参数详解 转http://www.jianshu.com/p/7134286b3a09 MySQL数据库中,在SELECT查询语句前边加上“EXPLAIN”或者“DESC”关键字,即可查看该查询语句的执行计划,分析执行计划是优化慢查询的重要手段.如: EXPLAIN SELECT * FROM school; DESC SELECT * FROM school; 执行结果: 执行计划参数.png 接下来对这10个参数进行简单解释: 1.id:在整个查询中SELECT的位置: 2

MySQL执行计划的讲解

最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~ 经过简单的修改,变为内连接的话,执行速度不到1秒. 下面是两条具体的sql: 左连接的sql如下: SELECT count(*) FROM investment i LEFT JOIN payment m ON m.bill_id = i.id; 执行结果如下: 使用内连接的sql如下: SELECT count(*) FROM investment

MySQL执行计划解读(转载)

MySQL执行计划解读 Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT …… 用于分区表的EXPLAIN 执行计划包含的信息 id 包含一组数字,表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下 如果是子查询,id的序号会递增,

mysql 执行计划的理解

1.执行计划就是在sql语句之前加上explain,使用desc 也可以.2.desc有两个选项extended和partitions,desc extended 将原sql语句进行优化,通过show warnings 可以看到优化后的sql语句. desc partitions 可以查看使用分区表的信息.3.比如:mysql> desc select * from student;+----+-------------+---------+------+---------------+----