设为首页 加入收藏

TOP

MySQL语句explain详解(一)
2016-12-11 08:15:03 】 浏览:692
Tags:MySQL 语句 explain 详解

我们一般再检查一个SQL语句执行效率的时候,通常会首先用explain来看下该语句的相关情况。虽然经常使用,但时候你深刻的理解了其结果中每个字段的含义呢?其中type字段是我们关注的重中之重。type字段的归纳:


连接类型
system 表只有一行
const 表最多只有一行匹配,通用用于主键或者唯一索引比较时
eq_ref 每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一种,
特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引
ref 如果每次只匹配少数行,那就是比较好的一种,使用=或<=>,可以是左覆盖索引或非主键或非唯一键
fulltext 全文搜索
ref_or_null 与ref类似,但包括NULL
index_merge 表示出现了索引合并优化(包括交集,并集以及交集之间的并集),但不包括跨表和全文索引。
这个比较复杂,目前的理解是合并单表的范围索引扫描(如果成本估算比普通的range要更优的话)
unique_subquery 在in子查询中,就是value in (select...)把形如“select unique_key_column”的子查询替换。
PS:所以不一定in子句中使用子查询就是低效的!
index_subquery 同上,但把形如”select non_unique_key_column“的子查询替换
range 常数值的范围
index a.当查询是索引覆盖的,即所有数据均可从索引树获取的时候(Extra中有Using Index);
b.以索引顺序从索引中查找数据行的全表扫描(无 Using Index);
c.如果Extra中Using Index与Using Where同时出现的话,则是利用索引查找键值的意思;
d.如单独出现,则是用读索引来代替读行,但不用于查找
all 全表扫描


下面是explain所有输出结果的详解:


一.语法


explain < table_name >


例如: explain select * from t1 where id=888;


二.explain输出解释


+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+


| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |


+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+


1.id


我的理解是SQL执行的顺利的标识,SQL从大到小的执行.


例如:


mysql> explain select * from (select * from ( select * from t1 where id=888) a) b;


+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+


| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |


+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+


| 1 | PRIMARY | | system | NULL | NULL | NULL | NULL | 1 | |


| 2 | DERIVED | | system | NULL | NULL | NULL | NULL | 1 | |


| 3 | DERIVED | t1 | const | PRIMARY,idx_id | PRIMARY | 4 | | 1 | |


+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+


很显然这条SQL是从里向外的执行,就是从id=3 向上执行.


2. select_type


就是select类型,可以有以下几种


(1) SIMPLE


简单SELECT(不使用UNION或子查询等) 例如:


mysql> explain select * from t1 where id=888;


+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+


| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |


+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+


| 1 | SIMPLE | t1 | const | PRIMARY,idx_id | PRIMARY | 4 | const | 1 | |


+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+


(2). PRIMARY


我的理解是最外层的select.例如:


mysql> explain select * from (select * from t1 where id=888) a ;


+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+


| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |


+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+


| 1 | PRIMARY | | system | NULL | NULL | NULL | NULL | 1 | |


| 2 | DERIVED | t1 | const | PRIMARY,idx_id | PRIMARY | 4 | | 1 | |


+----+-------------+------------+-----

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Oracle备库TNS连接失败的分析 下一篇EXPDP 时ORA-27054 问题解决方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目