Mysql调优(三)执行计划

目录

Explain

id

select_type

table

type(重点)

possible_keys

key

key_len

ref

rows

extra


Explain

EXPLAIN语句提供了关于MySQL如何执行语句的信息。 EXPLAIN可以使用SELECT、DELETE、INSERT、REPLACE和UPDATE语句。

EXPLAIN为SELECT语句中使用的每个表返回一行信息。 它按照MySQL在处理语句时读取的顺序列出了输出中的表。 MySQL使用嵌套循环连接方法解析所有连接。 这意味着MySQL从第一个表中读取一行,然后在第二个表、第三个表中找到匹配的行,以此类推。 当处理所有表时,MySQL输出所选的列,并通过表列表回溯,直到找到一个有更多匹配行的表。 从该表中读取下一行,然后继续处理下一个表。  

 

id

选择标识符。 这是查询中SELECT的顺序编号。 如果行是其他行的并集结果,则该值为NULL。

select_type

主要用来分辨查询的类型,是普通查询还是联合查询还是子查询

Value

Meaning

SIMPLE

Simple SELECT (not using UNION or subqueries)

PRIMARY

Outermost SELECT

UNION

Second or later SELECT statement in a UNION

DEPENDENT UNION

Second or later SELECT statement in a UNION, dependent on outer query

UNION RESULT

Result of a UNION.

SUBQUERY

First SELECT in subquery

DEPENDENT SUBQUERY

First SELECT in subquery, dependent on outer query

DERIVED

Derived table

UNCACHEABLE SUBQUERY

A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query

UNCACHEABLE UNION

The second or later select in a UNION that belongs to an uncacheable subquery (see UNCACHEABLE SUBQUERY)

table

对应行正在访问哪一个表,表名或者别名,可能是临时表或者union合并结果集 1、如果是具体的表名,则表明从实际的物理表中获取数据,当然也可以是表的别名

type(重点)

type显示的是访问类型,访问类型表示我是以何种方式去访问我们的数据,最容易想的是全表扫描,直接暴力的遍历一张表去寻找需要的数据,效率非常低下,访问的类型有很多,效率从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般情况下,得保证查询至少达到range级别,最好能达到ref

  • system 该表只有一行(=系统表)。 这是const连接类型的特殊情况。
  • const 该表最多有一个匹配的行,在查询的开始读取。 因为只有一行,所以这一行中的列的值可以被优化器的其余部分视为常量。 Const表非常快,因为它们只被读取一次。
  • eq_ref 对于前面表中的每个行组合,将从该表中读取一行。 除了系统类型和const类型,这是最好的连接类型。 当连接使用索引的所有部分,并且索引是主键或UNIQUE NOT NULL索引时使用。
  • ref 对于前面表中的每个行组合,将从该表中读取具有匹配索引值的所有行。 如果连接仅使用键的最左边前缀,或者该键不是PRIMARY key或UNIQUE索引(换句话说,如果连接不能根据键值选择单行),则使用ref。 如果所使用的键只匹配少数行,那么这是一种很好的连接类型。
  • fulltext 连接使用FULLTEXT索引执行。  
  • ref_or_null 这个连接类型类似于ref,但是MySQL会额外搜索包含NULL值的行。 这种连接类型优化最常用于解析子查询。
  • index_merge 此连接类型表明使用了Index Merge优化。
  • unique_subquery Unique_subquery只是一个索引查找函数,它完全替代子查询以提高效率。
  • index_subquery 这种连接类型类似于unique_subquery。 它代替了IN子查询,但它适用于以下形式的子查询中的非唯一索引:  
  • range 当使用任意的=,<>,>,>=,, BETWEEN, LIKE, or IN()操作符将键列与常量进行比较时,可以使用range
  • index 索引连接类型与ALL相同,只是扫描的是索引树。如果索引是查询的覆盖索引,并且可以用来满足表中所需的所有数据,则只扫描索引树。 仅索引扫描通常比ALL扫描快,因为索引的大小通常小于表数据。
  • All 对前面表中的每个行组合进行全表扫描。 如果表是第一个没有标记为const的表,这通常不太好,在所有其他情况下通常都很糟糕。 通常,您可以通过添加索引来避免ALL,这些索引支持基于常量值或早期表中的列值从表中检索行。  

possible_keys

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

key

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

key_len

表示索引中使用的字节数,可以通过key_len计算查询中使用的索引长度,在不损失精度的情况下长度越短越好。

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

rows

根据表的统计信息及索引使用情况,大致估算出找出所需记录需要读取的行数,此参数很重要,直接反应的sql找了多少数据,在完成目的的情况下越少越好

extra

包含额外的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值