explain的使用

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在select语句之前增加explain关键字,Mysql会在查询上设置一个标记,执行查询会返回执行计划的信息,并不会执行这条SQL,就比如下面这个

SQL语句性能统计指标:

id: select语句标识符
select_type:select语句查询类型
table: 查询用到的表
partitions: 查询匹配到的分区
type:表连接类型
possible_keys:可能用到的索引
key:时间用到的索引
key_len:索引长度
ref:查询条件中的列
rows:预计扫描的行数
filtered:过滤行所占的百分比
Extra:附加信息

explain字段详解

id列

id表示查询语句的序号,自动分配,顺序递增,值越大,执行优先级越高 id相同是,优先级由上而下

select_type列

select_type表示查询类型,常见的有SIMPLE简单查询,PRIMARY主查询,SUBQUERY子查询、UNION联合查询、UNION RESULT联合临时表结果等。

table列

table表示SQL语句查询的表名、表别名、临时表名。

partitions列

partitions表示SQL查询匹配到的分区。没有分区的话显示NULL

type列

type表示表连接类型或者数据访问类型,就是表之间通过什么方式建立连接的,或者通过什么方式访问到数据的。具体有以下值,性能由好到差依次是:

system>const>eq_ref>ref>ref_or_null>index_merge>range>index>ALL

system:当表中只有一行记录,也就是系统表,是const类型的特例

const:表示使用主键或者唯一性索引进行等值查询,最多返回一条记录,性能较好,推荐使用。

eq_ref:表示表连接只有到了主键或者唯一性索引

ref:表示使用非唯一性索引进行等值查询

ref_of_null:表好似使用非唯一性索引进行等值查询,并且包含了null值的行

index_merge:表示用到索引合并的优化逻辑,即用到的多个索引

range:表示用到了索引范围查询

index:表示使用索引进行全表扫描

ALL:表示全表扫描,性能最差

possible_keys列

表示可能用到的索引列,实际查询并不一定能用到。

key列

表示实际查询用到的索引列

key_len列

表示索引所占的字节数。每种类型所占的字节数如下:

 

 

ref列

表示where语句或者表连接中与索引比较的参数,常见的有const(常量)、func(函数)、字段名。如果没用到索引,则显示为NULL

rows列

表示执行SQL语句所扫描的行数

filtered列

表示按条件过滤的表行的百分比 用来估算与其他表连接是扫描的行数,row x filtered=252004 x 10% =25万行

Extra列

表示一些额外的扩展信息,不适合在其他列展示,却又十分重要

Using wher:表示使用了wher条件搜索,但没有使用索引

Using index:表示用到了覆盖索引,即在索引上就查到了所需数据,无需二次回表查询,性能较好

Using filesort:表示使用了外部排序,及排序字段没有用到索引

Using filesort:表示使用了外部排序,即排序字段灭有用到索引

Using temporary:表示用到了临时表

Using join buffer:表示在进行表关联的时候,没用用到索引,使用了连接缓存去存储临时结果。

Using index condition :表示用到索引下推的优化特性

 

 posted on 2023-01-31 10:48  boye169  阅读(31)  评论(0编辑  收藏  举报