explain + sql语句 了解次条sql语句的执行计划
字段如下:
-
id(ID):表示查询中每个操作的序号。id值越大,则该操作在查询过程中发生得越晚
-
select_type(SELECT类型):指定了查询使用的不同类型。常见的select_types包括SIMPLE、PRIMARY KEY、SUBQUERY等。
-
table(表名):表名。
-
partitions(分区):如果查询涉及到分区表,此列会显示所选取的分区。
-
type(连接类型):指示MySQL使用的连接类型来获取结果集。常见的连接类型包括ALL、INDEX、RANGE、REF等。更好的连接类型可能需要索引支持。
-
possible_keys(可能的键):显示可能应用于查询的索引列表
-
key(实际使用的键):实际使用的索引
-
key_len(键长度):索引的长度。对于BLOB和TEXT类型的索引,key_length的值为0。
-
ref(引用):显示MySQL使用的索引的列或常量。
-
rows(返回的行数):读取的行数。
-
filtered(已过滤的百分比):WHERE过滤后,返回的行数与全部行数之间的比例。
-
Extra(额外信息):提供有关查询的额外信息,例如文件排序、联合查询等。
id:
select查询的序列号:id值越大,优先级越高,id值相同时,则执行顺序自上而下
并不是有where子查询时id就会增加,具体何时会导致id增加暂时不清楚(下图)
select_type:查询的类型
simple :简单子查询(很多博客说不使用union和子查询)---应该指的是不包括in关键字吧。。
primary:最外层子查询
subQuery:第一层子查询
derived:派生表(没有演示出来,网上找了好些例子,结果都是simple)
union:出现在union后面的查询
uniion result :union联合查询获取结果的select
table:查询对应的表,可以是一个结果集
partitions(5.7版本后):表使用的哪个分区(之前的案例都没有分区,所以都为null)
分区:把一张表物理上水平拆分,对应的文件可以放在同一磁盘,也可以放在不同磁盘
分表:水平分表和垂直分表,需要修改代码,查询时需要union
type:查询类型,普通查询,联合查询,子查询等。
性能从差-->好:All,index,range,ref,eq_ref,system,null
All:全表查询(从磁盘中读取)
index:也是读取全表,但是是从索引中读取
range:只用一个索引来选择行,key列显示所用的索引,一般是在where子句里面出现between,and,>,<等查询符合
ref:用非唯一索引查出对应的所有行
eq_ref:
同ref差不多,但返回结果只有一体记录
const:sql对查询部分进行优化,并转换为一个常量
system:同const差不多,但是表里面只有一条数据
possible_keys:查询涉及到的字段是存在索引,则索引被列出,但不一定被使用
key:实际使用的索引
key_len:索引使用的字节数,为索引字段的最大可能长度,并非实际使用值,即此值是根据表定义计算得出,而非根据实际使用的数据得出
ref:连接匹配条件,或为null,或为const
rows:估算得出结果,mysql需要读取的行数
Extra:查询的一些信息