SQL性能问题Explain-select_type

select_type:查询类型

PRIMARY : 包含子查询SQL中的 主查询 (最外层)

SUBQUERY:包含子查询SQL中的 子查询 (非最外层)

simple : 简单查询(不包含子查询、union)

derived : 衍生查询(使用到了临时表)

   

a.在from子查询中只有一张表

explain select cr.cname         from ( select * from course where tid in (1,2) ) cr ;

   

b.在from子查询中, 如果有table1 union table2 ,则table1 就是derived,table2就是union

explain select cr.cname         from ( select * from course where tid = 1 union select * from course where tid = 2 ) cr ;

   

union:上例

union result :告知开发人员,那些表之间存在union查询

   

   

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

   

   

   

type : 索引类型、类型

system>const>eq_ref>ref>range>index>all ,要对type进行优化的前提:有索引

   

其中:system,const只是理想情况;实际能达到 ref>range

   

system(忽略) : 只有一条数据的系统表 ;或 衍生表只有一条数据的主查询

create table test01

(

tid int(3),

tname varchar(20)

);

   

insert into test01 values(1,'a') ;

commit;

增加索引

alter table test01 add constraint tid_pk primary key(tid) ;

explain select * from (select * from test01 )t where tid =1 ;

   

const:仅仅能查到一条数据的SQL ,用于Primary key 或unique索引 (类型 与索引类型有关)

explain select tid from test01 where tid =1 ;

alter table test01 drop primary key ;

create index test01_index on test01(tid) ;

   

eq_ref:唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0)

select ... from ..where name = ... .常见于唯一索引 和主键索引。

   

alter table teacherCard add constraint pk_tcid primary key(tcid);

alter table teacher add constraint uk_tcid unique index(tcid) ;

   

   

explain select t.tcid from teacher t,teacherCard tc where t.tcid = tc.tcid ;

   

以上SQL,用到的索引是 t.tcid,即teacher表中的tcid字段;

如果teacher表的数据个数 和 连接查询的数据个数一致(都是3条数据),则有可能满足eq_ref级别;否则无法满足。

   

   

ref:非唯一性索引,对于每个索引键的查询,返回匹配的所有行(0,多)

准备数据:

insert into teacher values(4,'tz',4) ;

insert into teacherCard values(4,'tz222');

   

测试:

alter table teacher add index index_name (tname) ;

explain select * from teacher         where tname = 'tz';

   

   

range:检索指定范围的行 ,where后面是一个范围查询(between ,> < >=, 特殊:in有时候会失效 ,从而转为 无索引all)

alter table teacher add index tid_index (tid) ;

explain select t.* from teacher t where t.tid in (1,2) ;

explain select t.* from teacher t where t.tid <3 ;

   

index:查询全部索引中数据

explain select tid from teacher : --tid 是索引, 只需要扫描索引表,不需要所有表中的所有数据

   

   

all:查询全部表中的数据

explain select cid from course : --cid不是索引,需要全表所有,即需要所有表中的所有数据

   

   

system/const : 结果只有一条数据

eq_ref : 结果多条;但是每条数据是唯一的 ;

ref:结果多条;但是每条数据是是0或多条 ;

posted @ 2020-10-29 18:21  黑质白章  阅读(595)  评论(0编辑  收藏  举报