id 查看SQL语句的执行顺序
id相同:从上到下执行;
id不同:按从大到小顺序执行;
id部分相同、部分不同: 相同部分从上到下执行
不同部分从大到小顺序执行
id相同可以看做一个分组
select_type 数据查询类型
查询类型:包括[普通查询,联合查询,子查询,主查询]simple 简单查询 查询不包含子查询或者unionprimary 主查询 查询中包含任何复杂的子部分,最外层被标记为primary
subquery 子查询 在select或where列表中包含了子查询
例: select*from t1 where id =(select id from t2)from t1 会被标记为 主查询 并且id被标记为1from t2 会被标记为 子查询 并且id被标记为2
所以查询顺序为先查询子查询 然后查询主查询
derived 在from列表中包含的子查询会被标记为derived(衍生)MySQL会递归执行这些子查询,并把结果放入临时表中
union 若第二个select出现在union之后,则会被标记为union 若union包含在from子句的子查询中,外层select会被标记为derived
union result 从union表获取结果的select
table 是哪张表的数据
type 访问类型
从最好到最差 system->const->eq_ref->ref->index->all
百万级别可以优化 一般到range级别
system 表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计
const 表示通过一次索引就找到了,const用于比较primarykey 或者unique 索引
eq_ref 唯一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配,常用于主键或唯一索引扫描
比如给身份证建立唯一索引,查询身份证号为XXX的学生,那么表中肯定只有一个学生数据与之匹配
ref 非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,
它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以它应该属于查找个扫描的混合体
* 比如给age建立索引然后查询age=18的学生,它有可能找到多个学生
* range 给定索引的范围,通过范围查询
* 比如通过主键索引 查询主键id为10~20的学生 select*from student where id 》=10and id《=20index 全索引扫描
比如 select id from student 查询student中的所有id 由于id是主键索引 索引为全索引扫描
all 全表扫描
distinct:在select部分使用了distinc关键字
Using filesort:当 Extra 中有 Using filesort 时表示MySQL需额外的排序操作不能通过索引顺序达到排序效果一般有 Using filesort, 都建议优化去掉因为这样的查询 CPU 资源消耗大
Usingindex“覆盖索引扫描”表示查询在索引树中就可查找所需数据不用扫描表数据文件往往说明性能不错
Usingtemporary查询有使用临时表一般出现于排序,分组和多表join的情况查询效率不高建议优化
usingwhere: where 子句用于限制哪一行
usingjoin buffer: 使用连接缓存