执行计划中的内容-电商数据库设计及优化学习笔记

一、背景

这是我的电商数据库设计及优化学习笔记中关于执行计划中的内容部分。
我们可以从执行计划中获得以下信息:
1、SQL是如何使用索引的,
2、还可以确认在关联查询时连接查询的执行顺序,
3、还可以查询扫描的数据的行数,可以从另一个方面说明SQL有没有正确使用索引。
那么执行计划中都有哪些内容呢?

二、内容

ID列
ID列中的数据为一组数字,表示执行SELECT语句的顺序。
如果ID列值为null,这说明这组数据是由另外两个数据库进行unit操作所产生的结果集。
ID值为数字时,如果ID值相同,执行顺序由上至下,ID值越大优先级越高,越先被执行。
SELECT_TYPE列
有几种可能的值,
SIMPLE(不包含子查询或是UNION操作的查询),PRIMARY(查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY),
SUBQUERY(SELECT列表中的子查询),DEPENDT,SUBQUERY(依赖外部结果的子查询),
UNION(UNION操作的第二个或是之后的查询的值为union),
DEPENDENT UNION(当UNION作为子查询时,第二个或是第二个后的查询的select_type值),
UNION RESULT(UNION产生的结果集,这是它的id列值应该是null),
DERIVED(出现在FROM子句中的查询)
TABLE列
输出数据行所在的表的名称
(unionM,N)由ID为M,N查询UNION产生的结果集
(derivedN)、(subqueryN)由ID为N的查询产生的结果集
PARTITIONS列
输出分区表的列,对于分区表,显示查询的分区ID,对于非分区表,显示为NULL.
TYPE列
以下的值性能由高到低,
system(这是const联接类型的一个特例,当查询的表只有一行时使用,),
const(表中有且只有一个匹配的行是使用,如对主键或是唯一索引的查询,这是效率最高的连接方式),
eq_ref(唯一索引或主键引查找,对于每个索引键,表中只有一条记录与之匹配),
ref(非唯一索引查找,返回匹配某个单独值的所有行),
ref_or_null(类似于ref类型的查询,但是附加了对NULL值列的查询),
index_merge(该联接类型表示使用了索引合并优化方法),range(索引范围扫描,常见于between、>、<这样的查询条件),index(FULL index Scan全索引扫描,同ALL的区别是,遍历的是索引树),all(FULL TABLE Scan全表扫描,这是效率最差的联接方式)
Extra列
distinct(优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作),
not exists(使用not exists来优化查询),using filesort(使用额外操作进行排序,通常会出现在ORDER BY或GROUP BY查询中,查询效率比较差),
using index(使用了覆盖索引进行查询),
Using temporary(MYSQL需要使用临时表来处理查询,常见于排序,子查询,和分组查询),
Using where(需要在MYSQL服务器层使用WHERE条件来过滤数据),select tables,optimized away(直接通过索引来获得数据,不用访问表)
POSSIBLE_KEY列
指出MYSQL能使用哪些索引来优化查询,查询列所涉及到的列上的索引都会被列出,但不一定会被使用。
KEY列
优化查询是实际所使用的索引,如果没有则显示NULL,如果使用了覆盖索引,会只显示在POSSIBLE_KEY中
KEY_LEN列
表示索引字段的最大可能长度,是由字段定义计算的,并非数据实际长度。
REF列
说明了当前表利用KEY中的索引是用到的lie或者常亮。
ROWS列
表示MYSQL通过索引统计信息,估算的所需读取的行数。其值是统计抽样结果,并不十分准确
Filtered列
表示返回结果的行数占需读取行数的百分比,越大越好,依赖于统计信息,并不十分准确。

三、小结

通过执行计划我们可以知道MySQL服务器是如何处理我们提交的请求的。帮助我们查看SQL的执行效率,以及是否正确地使用索引。

猜你喜欢

转载自blog.csdn.net/qq_40916110/article/details/80768938