个人可做网站需要什么材料,可以做3d电影网站,娱乐平台网站建设,小工作室做网站一、EXPLAIN语句的作用
在客户端执行MySQL的操作语句#xff0c;会依次经过MySQL客户端连接管理、语法解析与优化#xff08;查询缓存、语法解析、查询优化#xff09;、存储引擎层。其中查询优化器在基于成本和规则对查询语句进行优化#xff0c;并且在优化后会生成一个执…一、EXPLAIN语句的作用
在客户端执行MySQL的操作语句会依次经过MySQL客户端连接管理、语法解析与优化查询缓存、语法解析、查询优化、存储引擎层。其中查询优化器在基于成本和规则对查询语句进行优化并且在优化后会生成一个执行计划。MySQL提供了EXPLAIN语句来查看查询语句经过查询优化器优化后的执行计划。 定义本章所使用的表结构
CREATE TABLE source_learn (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 自增主键,data_type enum(oracle’,mysql) DEFAULT oracle COMMENT 源类型,name varchar(100) NOT NULL COMMENT 源名称,PRIMARY KEY (id) USING BTREE
) ENGINEInnoDB AUTO_INCREMENT1DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC;CREATE TABLE source_learn_param (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 自增id,source_id bigint(20) NOT NULL COMMENT 关联源id,key varchar(50) NOT NULL COMMENT 参数key,value text NOT NULL COMMENT 参数值,data_type enum(oracle,mysql) DEFAULT oracle COMMENT 源类型,PRIMARY KEY (id) USING BTREE,KEY source_id_index (source_id) USING BTREE
) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC;CREATE TABLE table_test_learn (id bigint(20) NOT NULL AUTO_INCREMENT,source_id bigint(20) DEFAULT NULL COMMENT 源id,PRIMARY KEY (id) USING BTREE
) ENGINEInnoDB AUTO_INCREMENT1DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC COMMENT元数据;
二、EXPLAIN语句的属性含义及作用
EXPLAIN语句包含如下属性列
属性名说明id每个SELECT对应的唯一idselect_type每个SELECT对应的查询类型table表名称paritions分区信息type单表的访问方法possible_keys可能使用到的索引key实际使用的索引key_len实际使用到的索引长度refrows预计要读取到的记录数量filteredExtra额外的一些信息
1、id
在查询语句经过查询优化器优化后的查询语句中可能会包含多个SELECT语句每个select语句都会对应一个唯一的id。并且查询计划会为每个表生成一个记录但是这些记录的id可能存在相同的情况。 1简单的SELECT语句
explain select id,name from source_learn where data_type oracle;2包含子查询的SELECT语句
EXPLAIN select * from table_test_learn as test where test.source_id in (select source_learn.id from source_learn where source_learn.data_type oracle);可以看到这个子查询语句生成的执行计划中包含两条记录这两条的分别对应表table_test_learn和表source_learn。这个查询语句包含了两个SELECT查询语句为什么id值是相同的呢这里的id相同表示着通过查询优化器对查询语句的优化将子查询语句转变成了连接查询语句。
2、select_type
在一个查询语句中可能包含多个小的查询语句在MySQL中每个小的查询语句都包含select_type属性通过该属性的取值我们可以判断出这个小的查询语句在整个查询语句中扮演着一个什么样的角色。该属性的取值如下
取值说明SIMPLE没有UNION或查询优化器优化后不包含子查询的语句PRIMARY包含联合查询或查询优化器优化后包含子查询的第一条记录的select_type的取值就是PRIMARYUNION查询语句包含联合查询除了第一个记录外其余记录的select_type的取值是UNIONUNION RESULT对于UNION操作产生的临时表的select_type的取值为UNION RESULTSUBQUERY对于非相关子查询的记录的select_type的取值为SUBQUERYDEPENDENT SUBQUERY对于相关子查询的记录的select_type的取值为DEPENDENT SUBQUERYDEPENDENT UNIONDERIVEDMATERIALIZED对于包含子查询的语句存在需要将子查询物化后再参与连接查询此时的select_type的取值为MATERIALIZED
1SIMPLE
下面展示了内连接查询语句的执行计划在查询语句中不包含UNION和子查询因此两条记录的select_type的取值都是SIMPLE。
EXPLAIN select * from source_learn inner join source_learn_param on source_learn.id source_learn_param.source_id;2PRIMARY、UNION、UNION RESULT
下面展示了查询语句中使用UNION关键字其中语句最左边的是PRIMARY其余的查询是UNIONUNION RESULT表示的是对于UNION的语句处理使用了临时表进行了去重处理。
EXPLAIN select data_type from source_learn UNION select data_type from source_learn_param;下面展示了查询语句中使用了UNION ALL关键字执行计划详情 UNION ALL不会进行去重处理因此没有产生临时表。
EXPLAIN select data_type from source_learn UNION ALL select data_type from source_learn_param;5SUBQUERY
下面展示了查询语句在字段中使用了子查询操作在左边的查询语句的的select_type为PRIMARY。剩下的一个查询语句查询优化器并为对其优化成连接查询的形式并且改查询语句为非相关子查询因此select_type为SUBQUERY。
EXPLAIN select source_learn.data_type, (select DISTINCT(source_id) from source_learn_param where source_learn_param.id 1) as key_source_id from source_learn;6DEPENDENT SUBQUERY
下面展示的是相关子查询查询计划记录的select_type的取值为DEPENDENT SUBQUERY。
where条件后面的相关子查询语句
EXPLAIN select source_learn.data_type from source_learn where source_learn.id in (select source_id from table_test_learn) or source_learn.data_type oracle;字段为相关子查询的语句
EXPLAIN select source_learn.data_type, (select DISTINCT(source_id) from source_learn_param where source_learn_param.data_type source_learn.data_type) as key_source_id from source_learn;7DEPENDENT UNION
在存在UNION的查询语句中如果各个子查询语句间存在依赖关系者除了第一个记录的select_type为PRIMARY其他的子查询语句记录中的select_type为DEPENDENT UNION
EXPLAIN select * from source_learn where id in (select source_id from source_learn_param where data_type oracle UNION select id from source_learn where nameoracle_source)8DERIVED
9MATERIALIZED
下面的查询语句展示了表table_test_learn子查询物化后参与连接查询。
EXPLAIN (select data_type from source_learn where source_learn.id in (select source_id from table_test_learn)) UNION ALL select data_type from source_learn_param;3、table
无论我们写的SQL语句有多复杂最终都会对单个表进行查询操作查询计划会为每个表生成一条记录记录中的table列就表示表的名字。
4、paritions
这个属性是有关分区表的相关查询操作还未遇到过占不讨论遇到了再做补充。
5、type
6、possible_keys
7、key
8、key_len
9、ref
10、rows
11、filtered
12、Extra