Mysql explain

## SQL优化
sql优化的一般步骤
1.使用show status了解各种sql的执行频率
2.定位执行效率较低的sql语句(通过慢查询日志定位那些查询效率较低的sql语句)
3.通过explain分析低效的sql执行计划
4.确定问题并采取相应的优化措施

## explain如何进行分析?
explain能干嘛?
1.表的读取顺序
2.数据读取操作的操作类型
3.哪些索引可以使用
4.哪些索引被实际使用
5.表之间的引用
6.每张表有多少行被优化器查询

#### 执行计划包含的信息
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

#### 1.表的读取顺序
id:一组数字,表示查询中执行select子句或操作表的顺序
id如果相同的话,可以认为是一组,从上到下执行
id相同的情况下,执行顺序由上到下
id不同的情况下,如果是子查询,id的序号会递增,被最先执行子查询,id值越大优先级越高,越先被执行

#### 2.select_type查询类型
1.simple 简单的select查询,查询中不包含子查询或union
2.primary 查询中包含任何复杂的子部分,最外层的查询,可以认为是最后加载的那个
3.subquery
4.derived 在from列表中包含的子查询被标记为dervied(衍生),mysql会递归执行这些子查询,把结果放到临时表中
4.union 若第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select被标记为derived
5.union result 从union表获取的结果的select

#### 3.table
显示这一行的数据是关于哪张表的
#### 4.type访问类型
ALL | index | range | ref | eq_ref | const,system | NULL
从左到右,性能由最差到最好
ALL:全表扫描
index:索引全扫描
ref:使用非唯一索引扫描或唯一索引的前缀扫描
eq_ref:类似ref,区别就是使用的所有是唯一索引,对于每个索引键值表中只有一条记录匹配
const,system:单表中最多有一个匹配行,查询速度非常快
NULL:mysql不用访问表或索引,直接就能得到结果
#### 5.possible_keys(显示可能用在这张表中索引,但是可能没用到)和6.key
主要解决的问题:判断所有失效和mysql到底用了哪个索引
key:实际使用的索引,如果为NULL,则没有使用索引,若查询中使用了覆盖索引,则该索引只出现在key列表中
#### 6.key_len
表中索引使用的字节数
key_len显示的值是索引字段最大可能的长度,并非实际使用的长度
#### 7.ref
表之间的引用
#### 8.rows
根据表统计信息及索引的选用情况,大致估算出找到所需记录所需要读取的行数,值越小越好
#### 9.Extra
包含不适合在其它列中显示但十分重要的额外信息
原文地址:https://www.cnblogs.com/wylwyl/p/11072711.html