MySQL中的explain字段

MySQL中的explain字段

explain字段,主要在查看查询优化器中如何进行优化,对应的执行计划。

简单述说:

explain分析后的结果主要包括

查询的序列号id,也是查询操作表的顺序; select_type查询的类型,是简单查询还是联表查询,子查询等; Table就是涉及到的表名; partitions就是分区的情况; Type字段就相对重要点,表示访问表的方式,通常用来看是否使用了索引。也表明这条sql的查询性能。 possible_keys可能用到的索引列表 key是实际使用的索引 key_len:表示索引的长度 ref指示索引的的比较条件或者连接使用的键 rows表示估计需要检查的行数 filtered表示通过索引进行查询的比例 Extra显示额外信息,也可以看索引的使用情况

字段具体分析:
  1. id:标识查询中每个操作步骤的唯一标识符,可以用于确定执行的顺序。

  2. select_type:指示查询的类型,例如:

    • SIMPLE:简单查询,不包含子查询或连接操作。

    • PRIMARY:最外层的查询。

    • SUBQUERY:在SELECT列表或WHERE子句中的子查询。

    • DERIVED:从子查询派生出的临时表。

    • UNIONUNION操作的第二部分或后续部分。

    • UNION RESULTUNION操作的结果。

    • DEPENDENT UNIONUNION子查询中依赖于外部查询的部分。

    • DEPENDENT SUBQUERY:子查询中依赖于外部查询的部分。

    • DEPENDENT UNION RESULT:依赖于外部查询的UNION操作的结果。

    • MATERIALIZED:表示使用了MATERIALIZED(材料化)技术的子查询。

    • UNCACHEABLE SUBQUERY:表示无法缓存的子查询。

  3. table:表示查询操作涉及的表名。

  4. partitions:表示查询扫描的分区数(如果表进行了分区)。

  5. type:表示访问表的方式(常用来看是否使用索引),常见类型及含义如下(从最佳到最差):

    • system:只有一行数据(系统表),这是特殊情况的一种,不会出现在InnoDB,出现在MyIsam。

    • const:通过索引一次就能找到匹配的唯一行数据(只返回一条数据),通常针对主键或唯一索引的等值查询。

    • eq_ref:使用等值连接,对于每个索引键,只有一条匹配的行数据,通常用于多表连接中连接条件为主键或唯一索引的查询。

    • ref:索引中最常见的,使用非唯一索引或唯一索引的前缀(最左原则)来查找匹配的行数据,返回多个匹配的行。

    • ref_or_nul:和ref差不多,增加了null值查询,需要扫描整个索引树信息。

    • index_merge:他会对将多个搜索结果(条件中有两个条件)合并为一个,同一回表查询数据,还可以对结果排序,从而降低查询代价。

    • range:使用索引范围(Between,Like,In,大于小于)需要对索引树进行扫描,效率不高。

    • index:进行全索引扫描,遍历整个索引树。

    • all:全表扫描,需要遍历整个表进行查询。

    • unique_subquery:少见,在Service服务层会对sql进行优化,引擎层就不会出现了,子查询的结果使用了唯一索引进行查询。

    • index_subquery:少见,在Service服务层会对sql进行优化,引擎层就不会出现了,子查询的结果使用了索引进行查询。

    • range_checked_for_each_record:根据上一个表的行数据进行范围搜索。

  6. possible_keys:表示 MySQL 可能用到的索引列表。

  7. key:表示实际使用的索引。

  8. key_len:表示索引的长度。

  9. ref:指示索引的比较条件或者是连接使用的键。

  10. rows:表示估计需要检查的行数。

  11. filtered:表示通过索引进行查询的比例。

  12. Extra:显示额外的信息,例如:

    • Using index:查询使用了覆盖索引,即只通过索引就能满足查询需求,无需回表访问实际数据行。

    • Using where:在查询过程中使用了WHERE子句进行条件过滤。

    • Using temporary:在查询过程中使用了临时表。通常发生在排序、分组或多表连接时。

    • Using filesort:进行了文件排序操作,无法通过索引直接进行排序。

    • Using join buffer:表示使用了连接缓存来处理连接操作。

    • Distinct:表示使用了DISTINCT关键字去重查询结果。

    • Full scan on NULL key:执行一个索引上的全表扫描,在索引列上的所有值都为NULL时发生。

    • Impossible WHERE:表示WHERE子句的条件总是返回false,因此不会返回任何行。

    • Select tables optimized away:表示查询中的某些表被优化器判断为不需要访问,结果直接从索引中获取。

    • No tables used:表示查询不涉及任何表,仅执行常数计算。

    • Using sort_union:表示在UNION操作的结果集上进行排序。

    • Using intersect:表示使用了INTERSECT操作。

再理解:

在 MySQL 中,EXPLAIN是一个非常有用的语句,用于分析 SQL 查询的执行计划。

一、作用与目的

  1. 了解查询执行过程:

    • EXPLAIN可以让你了解 MySQL 如何执行特定的 SQL 查询语句。它会显示查询的执行计划,包括查询使用的索引、表的连接顺序、查询的类型等信息。

    • 例如,当你执行一个复杂的多表连接查询时,通过EXPLAIN可以看到 MySQL 是如何选择表的连接顺序,以及是否使用了合适的索引来提高查询性能。

  2. 优化查询性能:

    • 通过分析EXPLAIN的结果,你可以找出查询性能瓶颈,并采取相应的优化措施。例如,如果发现查询没有使用索引,你可以考虑添加合适的索引来提高查询速度。

    • 例如,对于一个经常执行的查询,如果EXPLAIN显示查询使用了全表扫描,那么你可以通过创建索引或者优化查询语句来避免全表扫描,提高查询性能。

二、主要字段解释

  1. id

    • 表示查询中 SELECT 语句的编号。在复杂查询中,可能有多个 SELECT 语句,这个编号可以帮助你确定查询的执行顺序。

    • 例如,如果有多个表连接,id值较小的 SELECT 语句通常会先执行。

  2. select_type

    • 表示查询的类型,常见的类型有SIMPLE(简单查询,没有子查询或连接)、PRIMARY(主查询,外层的查询)、SUBQUERY(子查询)、DERIVED(派生表查询)等。

    • 例如,如果查询中有子查询,select_type会显示为SUBQUERY;如果查询是从一个派生表中查询数据,select_type会显示为DERIVED

  3. table

    • 表示查询涉及的表名。

    • 例如,如果查询涉及两个表的连接,这里会显示两个表的名称。

  4. type

    • 表示访问表的方式,是一个非常重要的指标。常见的类型有ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(使用非唯一索引进行等值查询)、eq_ref(使用唯一索引进行等值查询)等。

    • 例如,如果查询使用了索引范围扫描,type会显示为range;如果查询使用了唯一索引进行等值查询,type会显示为eq_ref。一般来说,type的值越接近eq_ref,查询性能越好。

  5. possible_keys

    • 表示可能使用的索引。这是 MySQL 根据查询语句分析出来的可能使用的索引,但不一定实际使用。

    • 例如,如果查询中有一个字段上有索引,这里会显示这个索引的名称。

  6. key

    • 表示实际使用的索引。如果查询没有使用索引,这里会显示为NULL

    • 例如,如果查询使用了一个索引进行快速查找,这里会显示这个索引的名称。

  7. key_len

    • 表示索引字段的长度。这个值可以帮助你了解索引的使用情况,以及是否使用了最有效的索引。

    • 例如,如果索引字段的长度过长,可能会导致索引占用过多的空间,影响查询性能。

  8. ref

    • 表示索引列与常量或者其他表的列进行等值连接的引用。

    • 例如,如果查询使用了一个外键索引进行连接,这里会显示外键列所引用的表和列的名称。

  9. rows

    • 表示 MySQL 估计需要扫描的行数。这个值是一个估计值,实际执行查询时可能会有所不同。

    • 例如,如果查询使用了全表扫描,rows的值可能会比较大;如果查询使用了索引进行快速查找,rows的值可能会比较小。

  10. Extra

  • 提供额外的信息,例如使用了临时表、文件排序等。

  • 例如,如果查询需要使用临时表进行排序,Extra会显示Using temporary;如果查询使用了文件排序,Extra会显示Using filesort。这些信息可以帮助你找出查询性能瓶颈,并采取相应的优化措施。

总之,EXPLAIN语句是 MySQL 中非常重要的一个工具,它可以帮助你了解查询的执行计划,找出查询性能瓶颈,并采取相应的优化措施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值