字段 | 含义 |
---|---|
id | select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序 |
select_type | 表示select的类型,常见的类型有simple(简单表,即不使用表连接或子查询)、primary(主查询,即外层的查询)、union(union中的第二或者后面的查询语句)、subquery(子查询中的第一个select)等 |
table | 输出结果集的表 |
type | 表示表的连接类型,性能由好到差的连接类型为(system–>const–>eq_ref–>ref–>ref_or_null–>index_merge–>index_subquery–>range–>index -->all) |
possible_keys | 表示查询时可能使用的索引 |
key | 表示实际使用的索引 |
key_len | 索引字段的长度 |
rows | 扫描行的数量 |
extra | 执行情况的说明和描述 |
分析执行计划-Explain之id
① id相同表示加载表的顺序从上倒下
② id不同 id值越大 优先级越高 越先被执行
③ id有相同 也有不同 同时存在 id相同的可以认为是一组,从上往下执行,在所有的组中,id的值越大,优先级越高,越先执行
分析执行计划-Explain之select_type
simple:没有子查询和union
primary:主查询,也就是子查询中的最外层查询
subquery:在select 和where中包含子查询
derived:在from包含子查询,被标记为临时表
union:存在union语句
分析执行计划-Explain之type
type | 含义 |
---|---|
NULL | MySQL不访问任何表,索引,直接返回结果 |
system | 系统表,少量数据,往往不需要进行磁盘IO,如果是5.7及以上版本的话就不是system了而是all,即使只有一条记录 |
const | 命中主键或者唯一索引,被链接的部分是一个常量值 |
eq_ref | 对于前表的每一行,后表只有一行被扫描.①join查询,②命中主键或者非空唯一索引③等值连接 |
ref | 非唯一索引扫描,返回匹配某个单独值的所有行,对于前表的每一行,后表可能有多余一行的数据被扫描 |
range | 只检索给定返回的行,使用一个索引来选择行,where 之后出现between,<,>,in等操作 |
index | 需要扫描索引上的全部数据 |
all | 全表扫描,此时id上无索引 |
结果值从好到坏依次是:system > const > eq_ref > ref > range > index > all
eg:
-- NULL
select now();select rand(); ....等等函数
-- system
select \* from mysql.tables_priv
-- const
select \* from user where uid=2;
-- eq_ref 左表有主键,而且左表的每一行和右表的每一行刚好匹配
select \* from a,b where a.id=b.id; -- a表id为主键
-- ref 左表是普通索引,和右表匹配时可能会匹配多行
select \* from a,b where a.id=b.id; -- a表id为普通索引
-- range
select \* from user where id > 2;
-- index 扫描索引列
select id from user;
-- all
select \* from user;
分析执行计划-Explain之table
显示这一步所访问数据库中表名称,有时不是真实的表名,可能是简称
分析执行计划-Explain之rows
扫描行的数量
分析执行计划-Explain之key
possible_key:显示可能应用在这张表的索引,一个或者多个
key:实际使用的索引,如果是null,则没有使用索引
key_len:表示索引中使用的字节数,改值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好.
索引优化
索引是数据库优化最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的MySQL的性能优化问题