目录
一条语句通过优化器之后,会生成具体的执行计划用于执行器执行sql。执行计划就是一条sql是如何在数据库执行的。我们可以通过执行计划查看一条查询sql的执行信息,例如:
1.是否使用索引
2..多表查询时查询表的顺序等等。
本文仅分享一下查询语句的执行计划。
方法1:可以在查询语句前添加关键字:explain,然后执行语句,示例如下:
explain
select * from t_good where good_name = '香蕉' and age = 2 ;
方法2:
在navicat中选中sql语句,直接在窗口栏中点击【解释】按钮,示例:
建议使用方法2。
执行explain之后会得到如下结果:
具体的含义如下:
是一个查询序列号,也代表着语句的执行顺序。
执行顺序:id不同,从大到小,id相同,从上到下。
主要有 4 种取值。
SIMPLE:表示简单查询,不包含子查询和联合查询。
PRIMARY:表示是最外层的查询。
UNION:表示联合查询中的第二个或者之后的查询。
DEPENDENTUNION:表示联合查询中的第二个或者之后的查询,而且这个查询受外查询的影响。
表示与查询结果相关的表的名称。
表示查询访问的分区
表示表是如何连接的。
常用的连接类型: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 :不访问表或者索引就能得到结果
表示 MySQL 可以通过哪些索引找到查询的结果记录。如果这里的值是空,就说明没有合适的索引可用。你可以通过查看 WHERE 条件语句中使用的字段,来决定是否可以通过创建索引提高查询的效。
表示优化器最终决定使用的索引是什么
表示优化器选择的索引字段按字节计算的长度。如果没有使用索引,这个值就是空
表示哪个字段或者常量被用来与索引字段比对,以读取表中的记录。如果这个值是“func”,就表示用函数的值与索引字段进行比对
表示为了得到查询结果,必须扫描多少行记录。这是一个预估值。
表示查询筛选出的记录占全部表记录数的百分比
extra :执行计划给出的额外的信息说明
using index :用到了索引,不需要回表
using where 使用了where过滤(跟是否使用索引没有关系)
using index condition 索引下推
using filesort 不能使用索引来排序,用到了额外的排序----需要优化
using temporary 用到了临时表
使用临时表的情况:distinct 非索引列,group by 非索引列,使用join的时候,group任意列
这是一张来自bilibili的图片。
具体的案例以后再分享。