explain sql 结果参数解读

● explain结果:

mysql> explain select * from emp;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   12 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

● id
id值相同,从上往下 顺序执行
表的执行顺序 因表的数据量改变而改变的原因: 笛卡儿积,数据小的表 优先查询
id值不同:id值越大越优先查询 (本质:在嵌套子查询时,先查内层 再查外层)
id值有相同,又有不同: id值越大越优先;id值相同,从上往下 顺序执行

● select_type : :查询类型
PRIMARY:包含子查询sql中 主查询(最外层)
SUBQUERY:包含子查询sql中的 子查询 (非最外层)
simple:简单查询(不包含子查询,union)
derived:衍生查询(使用到了临时表)

● type 索引类型
system>const>eq_ref>ref>range>index>all ---对type进行优化的前提:有索引

其中system,const只是理想中的情况,实际一般在ref>range
system(忽略): 只有一条数据的系统表 ;或 衍生表只有一条数据的主查询

const:仅仅能查到一条数据的SQL ,用于Primary key 或unique索引 (类型 与索引类型有关)
eq_ref:唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0)
ref:非唯一性索引,对于每个索引键的查询,返回匹配的所有行(0,多)
range:检索指定范围的行 ,where后面是一个范围查询(between ,> < >=, 特殊:in有时候会失效 ,从而转为 无索引all)

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

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

system/const: 结果只有一条数据
eq_ref:结果多条;但是每条数据是唯一的 ;
ref:结果多条;但是每条数据是是0或多条 ;

● possible_keys : 可能用到的索引,是一种预测,不准。
``
● key : 实际使用到的索引
● key_len :索引的长度,用来判断符合索引是否完全被使用(mysql中一个字符占3个字节)
● ref : 此ref与type的ref是两个概念, 指明当前表所参照的字段
● rows : 被索引优化查询的数据个数(实际通过索引而查询到的数据个数)
● Extra:
1. using filesort:性能消耗大;需要“额外”的一次排序(查询) 。常见于 order by 语句中。

explain select * from test02 where id> 1 order by id ;
小结:对于单索引, 如果排序和查找是同一个字段,则不会出现using filesort;如果排序和查找不是同一个字段,则会出现using filesort;
避免方法: where哪些字段,就order by那些字段

复合索引:不能跨列(最佳左前缀)
避免方法: where和order by 按照复合索引的顺序使用,不要跨列或无序使用。

2.using temporary:性能损耗大 ,用到了临时表。一般出现在group by 语句中。

	explain select a1 from test02 where a1 in ('1','2','3') group by a1 ;
	explain select a1 from test02 where a1 in ('1','2','3') group by a2 ; --using temporary
	避免方法:查询那些列,就根据那些列 group by .

3.using index::性能提升; 索引覆盖(覆盖索引)。原因:不读取原文件,只从索引文件中获取数据 (不需要回表查询)只要使用到的列 全部都在索引中,就是索引覆盖using index

例如:test02表中有一个复合索引(a1,a2,a3)
	explain select a1,a2 from test02 where a1='' or a2= '' ; --using index   

	drop index idx_a1_a2_a3 on test02;

	alter table test02 add index idx_a1_a2(a1,a2) ;
	explain select a1,a3 from test02 where a1='' or a3= '' ;


	如果用到了索引覆盖(using index时),会对 possible_keys和key造成影响:
	a.如果没有where,则索引只出现在key中;
	b.如果有where,则索引 出现在key和possible_keys中。

	explain select a1,a2 from test02 where a1='' or a2= '' ;
	explain select a1,a2 from test02  ;

4.using where : 需要回表查询

假设age是索引列
但查询语句select age,name from ...where age =...,此语句中必须回原表查Name,因此会显示using where.
explain select a1,a3 from test02 where a3 = '' ; --a3需要回原表查询

5.impossible where :where子句永远为false
explain select * from test02 where a1='x' and a1='y' ;

● SQL编写、解析过程

编写过程:
select dinstinct  ..from  ..join ..on ..where ..group by ...having ..order by ..limit ..

解析过程:			
from .. on.. join ..where ..group by ....having ...select dinstinct ..order by limit ...
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值