April 21, 2018

mysql执行计划

什么是执行计划?

执行计划给出了sql在执行过程中的详细信息: 使用了那些索引,查询的顺序,数据扫描的范围等。
通过执行计划,我们能够找出sql执行的痛点,从而针对性的优化sql。

执行计划有哪些的字段?

主要包括:id, select_type, type, possible_keys, key, ref, row, extra等。

每个字段的解读?

id

有一组数字组成。表示一个查询中各个子查询的执行顺序;

id相同执行顺序由上至下,id值越大越优先被执行。

select_type

表示查询中每个select子句的类型;

1.SIMPLE:查询中不包含子查询或者UNION
2.PRIMARY:包含子查询的查询中,最外层查询
3.SUBQUERY:SELECT/WHERE列表中的子查询
4.DERIVED:FROM列表中的子查询
5.DERIVED:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为DERIVED
6.从UNION表获取结果的SELECT被标记为:UNION RESULT

type

表示mysql在表中查找结果集的方式;

1.all:Full Table Scan,遍历全表以找到匹配的行
2.index:Full Index Scan,遍历索引树以找到匹配的行
3.range:索引范围扫描,对索引的扫描开始于某一点,结束于另一点
4.eq_ref:唯一性索引扫描,返回匹配某个单独值的唯一记录。
5.ref:非唯一性索引扫描,返回匹配某个单独值的所有记录。

possible_keys, key, ref, row, extra

possible_keys:表示MySQL可能使用哪个索引在表中找到行
key:表示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL
ref:表示哪些列或常量被用于查找索引列上的值,例如ref列的值为dept_id,表示dept_id为employee表和department表的连接匹配条件和索引查找条件
rows:表示找到结果集所需要读取的行数(估算值)
Extra:包含不适合在其他列中显示但十分重要的额外信息 如using where,using index

怎么使用执行计划?

查看row列,行数多的就需要优化,例如加上索引;查看Extra列,如果是using filesort,看下是不是使用了mysql函数使索引失效;查看type列,如果是Full Table Scan全表查找,需要加上索引。