文章目录
- 简介
- explain关键字分析
简介
explain主要是用来分析sql语句的,当你的系统中出现慢查询SQL后,你可以使用explain关键字对该语句进行分析。通过使用explain,我们可以得到以下结果
表的读取顺序
哪些索引可能使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
语法:explagin+你的sql
explain关键字分析
对某一个sql用完explain关键字分析后会得到一下字段:
标记的红色部分是我们需要关注的。
- id:
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序,id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
- select_type:主要有以下几种含义
SIMPLE 简单的select查询,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
SUBQUERY 在SELECT或WHERE列表中包含了子查询
DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中
UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
UNION RESULT 从UNION表获取结果的SELECT
- table:当前查询表,如果起了别名则显示的是对应别名
- partitions:表分区,如果你当前表未设置表分区则不显示
- type:
这一列表示关联类型或访问类型
效率从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
SQL性能优化的目标:至少要达到range级别,要求是ref级别,最好是consts级别。
system:当表中只有一条记录并且该表使用的存储引擎的统计数据都是精确地,表最多有一个匹配行,读取1次,速度比较快。
const:system是 const的特例,表里只有一条元组匹配时为system
eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。
ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会 找到多个符合条件的行。
range:用索引获取某些范围区间的记录。
- select_type
每个select对应一个select_type,表示select的复杂度
SIMPLE:简单查询。查询不包含子查询和union,如上图
PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
SUBQUERY:包含在 select 中的子查询(不在 from 子句中)
DERIVED:对于包含‘派生表’的查询
UNION:在 union 中的第二个和随后的 select
- possible_keys 可能用到的索引
- key 实际用到的索引,平时分析慢sql时就可以看下是否走了你想让mysql走的索引,以此来进行下一步分析。
- key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
- ref:显示哪一列被使用了,可以的话最好是个常数`
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
- row
mysql估计查询到结果所需要的查询行数 越少越好
- filtered
通过索引扫描表估计要读取并检测的行数rows。
使用额外的查询条件对rows行的数据进行过滤行得有行数n占rows的比例,
即 n/rows * 100%
- Extra sql执行计划比较重要的参考信息,常见重要信息如下
Using filesort(九死一生)
说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。
Using temporary(十死无生)
使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
Using index(发财了)
表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
Using where:使用where查询数据,需要回表去获取需要的数据
Using index condition:相当于索引覆盖后通过主键回表查询,再通过where过滤
引用
https://blog.csdn.net/why15732625998/article/details/80388236?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171022296216800213018443%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171022296216800213018443&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~hot_rank-1-80388236-null-null.nonecase&utm_term=explain&spm=1018.2226.3001.4450
https://blog.csdn.net/imwucx/article/details/130346522?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171022296216800213018443%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171022296216800213018443&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~hot_rank-3-130346522-null-null.nonecase&utm_term=explain&spm=1018.2226.3001.4450