MYSQL EXPLAIN 执行计划详解

explain的作用:

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

EXPLAIN SELECT
    (
        SELECT
            c. NAME
        FROM
            fx_channel c
        WHERE
            c.id = s.channel_id
    ) ,
    SUM(s.total_cost) ,
    SUM(s.total_count) ,
    SUM(s.success_count)
FROM
    fx_analysis_channel_source s
WHERE
    statistic_time >= ‘2017-01-20‘
AND statistic_time < ‘2018-01-20‘
GROUP BY
    s.channel_id
HAVING
    SUM(s.total_count) > 0
ORDER BY
    SUM(s.total_cost) DESC

1. id

SELECT识别符。这是SELECT查询序列号。查询序号即为sql语句执行的顺序。当id相同时,执行顺序从上而下依次执行。
当ID 不同时,id的值越大,越优先执行。当id值有相同又有不同时,先是执行id值大的语句,然后在相同id中,从上而下依次执行。

2.select_type

表示查询类型。

类型 描述
 simple  简单查询
 primary  最外面的select(鸡蛋壳)
 union  union语句的第二个或者说是后面那一个
 subquery  在select或where列表中包含了子查询
 derived  在FROM列表中包含的子查询被标记为derived(衍生)MySQL会递归执行这些子查询,把结果放在临时表中
 dependent union  UNION中的第二个或后面的SELECT语句,取决于外面的查询
 union result  UNION的结果

3.table

查询时所用的表。

4.type

连接类型。有多个参数,先从最佳类型到最差类型介绍 重要且困难

类型 描述
 system (最佳)  表仅有一行,这是const类型的特列,平时不会出现,这个也可以忽略不计
 const(次之)  表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。
 eq_ref(次之)  唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
 ref  非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它范湖所有匹配某个单独值得行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
 range(次之)  只检索给定返回的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某个点,而结束于另一给点,不用扫描全部索引。
 index(次之)  该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。
 ALL(最差)  对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索。

5.possible_keys

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段若存在索引,则该索引将被列出。但不一定被查询实际使用。

6.keys

MYSQL实际使用的索引.如果为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重叠。

7.key_len

MYSQL使用的索引长度。
在不损失精确性的情况下,长度越短越好

8.ref

显示索引的那一列被使用了。如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

9.rows

显示MYSQL执行查询的行数,一般情况下,越小越好

10.Extra

该列包含MySQL解决查询的详细信息。

类型 描述
 Distinct  MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
 range checked for each record  没有找到合适的索引
 using filesort  文件排序,说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引进行读取。
 using index  是否使用了索引
 using temporary  表示使用了临时表,如果出现这个,则必须优化。
 using where  表示使用了条件查询
 Using sort_union(…), Using union(…),Using intersect(…)  说明如何为index_merge联接类型合并索引扫描
 Using index for group-by  类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

通过相乘EXPLAIN输出的rows列的所有值,你能得到一个关于一个联接如何的提示。这应该粗略地告诉你MySQL必须检查多少行以执行查询。当你使用max_join_size变量限制查询时,也用这个乘积来确定执行哪个多表SELECT语句。

原文地址:https://www.cnblogs.com/fhwup/p/10036817.html

时间: 2024-10-01 03:32:21

MYSQL EXPLAIN 执行计划详解的相关文章

mysql explain执行计划详解

1).id列SELECT识别符.这是SELECT查询序列号.这个不重要,查询序号即为sql语句执行的顺序 2).select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个 C:union:union连接的两个select查询,第一个查询是de

MySQL 优化sql explain执行计划详解

mysql explain执行计划详解 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个C:

explain 执行计划详解

id:id是一组数字,表示查询中执行select子句或操作表的顺序,如果id相同,则执行顺序从上至下,如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行. id列为null的就表是这是一个结果集,不需要使用它来进行查询. select_type: simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个. primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_

Oracle执行计划详解

 简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容. 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predicate(谓词) DRiving Table(驱动表) Probed Table(被探查表) 组合索引(concatenated index) 可选择性(selectivity) 二.oracle访问数据的存取方法 1) 全表扫描(Full Table Scan

网站优化—mysql explain执行计划

explain执行计划 简介MySQL调优: 先发现问题(慢查询,profile) 对于使用索引和没有使用索引,了解到索引可以快速去查找数据 了解什么是索引(索引是排好序的快速查找的数据结构) 索引的管理(查看,创建,删除) 索引的本身的数据结构(B-TREE结构和聚簇结构) MySQL是如何去使用这些索引的(explain工具),需要去发现索引是否合理的被使用,防止索引滥用. ? 注意:索引对查询是有帮助的,但是对更新是没有好处的.索引要建立的合理. ? MySQL调优的一个通用思路(面试题)

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

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所以有些话语未必准确,请自行查看官网,若有些点下面没有例子的是因为当时一下子没有想出那么多来,如果大家有遇上好的例子,欢迎在下面留言我持续更新 查看执行计划的关键EXPLAIN 版本MYSQL5.6,用到的库是官网例子sakila,自行下载导入 由于要把每个点都翻译出来,还需要举例,所以需要一定的时间

MYSQL explain执行计划

用explain查看SQL的执行计划 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过EXPLAIN去完成. EXPLAIN命令是查看优化器如何决定执行查询的主要方法.可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用. 需要注意的是,生成的QEP并不

SparkSQL的执行计划详解

一:首先将我们从文本中读取的数据映射到表也就是视图 eg: $>cat b.txt 1 ded 2 dsfre 3 sfs 4 fr $>val sc = spark.sparkContext #创建SparkContext $>val rdd = sc.textFile("file:///home/Alex_lei/b.txt").map(x=>x.split(" ")).map(x=>(x(0),x(1))) #读取文件到rdd中(

MSSQLSERVER执行计划详解

序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博文给你:SqlServer性能检测和优化工具使用详细 ,sql语句的优化分析,T-sql语句查询执行顺序. 执行计划简介 1.什么是执行计划? 大哥提交的sql语句,数据库查询优化器,经过分析生成多个数据库可以识别的高效执行查询方式.然后优化器会在众多执行计划中找出一个资源使用最少,而不是最快的执行