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            全表扫描</code>

下面是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    | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |      |

|  2 | DERIVED    | <derived3> | 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 |

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/55222151011ee80eed7c19244d86116e.html