mysql进阶-执行计划

发布时间:2024年01月23日

目录

1. 概念

2. 使用

3. 具体相关字段含义

3.1 id

3.2 select_type

3.3 table

3.4 partition

3.5 type

3.6 possible_key

3.7 key

3.8 key_len

3.9 ref

3.10 row

3.11 filtered

3.12 extra


1. 概念

一条语句通过优化器之后,会生成具体的执行计划用于执行器执行sql。执行计划就是一条sql是如何在数据库执行的。我们可以通过执行计划查看一条查询sql的执行信息,例如:

1.是否使用索引

2..多表查询时查询表的顺序等等。

本文仅分享一下查询语句的执行计划。

2. 使用

方法1:可以在查询语句前添加关键字:explain,然后执行语句,示例如下:

explain 
select * from t_good where good_name = '香蕉' and age = 2 ;

方法2:

在navicat中选中sql语句,直接在窗口栏中点击【解释】按钮,示例:

建议使用方法2。

3. 具体相关字段含义

执行explain之后会得到如下结果:

具体的含义如下:

3.1 id

是一个查询序列号,也代表着语句的执行顺序。

执行顺序:id不同,从大到小,id相同,从上到下。

3.2 select_type

主要有 4 种取值。

SIMPLE:表示简单查询,不包含子查询和联合查询。

PRIMARY:表示是最外层的查询。

UNION:表示联合查询中的第二个或者之后的查询。

DEPENDENTUNION:表示联合查询中的第二个或者之后的查询,而且这个查询受外查询的影响。

3.3 table

表示与查询结果相关的表的名称。

3.4 partition

表示查询访问的分区

3.5 type

表示表是如何连接的。

常用的连接类型:system > const > eq_ref > ref > range >index > all

其他(fulltext,ref_or_null,index_merger,unique_subquery,index_subquery)

以上除了all,都能用到索引。

以下为详解:

system : const 的一种特例,只有一行满足条件。对MyISAM,Memory的表,只查询到一条记录,也是system

const : 主键索引或者唯一索引,只能查到一条数据的sql

eq_ref : 多表的join查询中,被驱动表通过唯一索引(unique或者primary)进行访问

小结: 以上三种都是可遇不可求的

ref : 查询用到了非唯一性索引,或者关联操作只使用了索引的最左前缀

range : 索引范围扫描 between and 或者 < > >= <= in等,type均为range

index :查询索引中的全部数据

all : 全表扫描

null :不访问表或者索引就能得到结果

3.6 possible_key

表示 MySQL 可以通过哪些索引找到查询的结果记录。如果这里的值是空,就说明没有合适的索引可用。你可以通过查看 WHERE 条件语句中使用的字段,来决定是否可以通过创建索引提高查询的效。

3.7 key

表示优化器最终决定使用的索引是什么

3.8 key_len

表示优化器选择的索引字段按字节计算的长度。如果没有使用索引,这个值就是空

3.9 ref

表示哪个字段或者常量被用来与索引字段比对,以读取表中的记录。如果这个值是“func”,就表示用函数的值与索引字段进行比对

3.10 row

表示为了得到查询结果,必须扫描多少行记录。这是一个预估值。

3.11 filtered

表示查询筛选出的记录占全部表记录数的百分比

3.12 extra

extra :执行计划给出的额外的信息说明

using index :用到了索引,不需要回表

using where 使用了where过滤(跟是否使用索引没有关系)

using index condition 索引下推

using filesort 不能使用索引来排序,用到了额外的排序----需要优化

using temporary 用到了临时表

使用临时表的情况:distinct 非索引列,group by 非索引列,使用join的时候,group任意列


这是一张来自bilibili的图片。

具体的案例以后再分享。

文章来源:https://blog.csdn.net/qq_37375667/article/details/135760259
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。