执行计划就是sql的执行查询顺序,以及如何使用索引查询,返回的结果集的行数
EXPLAIN SELECT * fom A where X =? and Y =?
EXPLAIN
加上查询语句
- id: 是一个有顺序的编码,是查询的顺序号,有几个select就显示几行。id的顺序就是按select出现的顺序增长的。id列的值越大执行优先级越高越先执行,id列的值相同则从上往下执行,id列的值为NULL最后执行。
2.selectType 表示查询中每个select子句的类型
- SIMPLE: 表示此查询不包含UNION查询或子查询
- PRIMARY: 表示此查询是最外层的查询(包含子查询)
- SUBQUERY: 子查询中的第一个SELECT
- UNION:表示此查询是UNION的第一个或随后的查询
- DEPENDENT UNION: UNION中的第二个或后面查询语句,取决于外面的查询
- UNION RESULT, UNION的结果
- DEPENDENT SUBQUERY: 子查询中的第一个SELECT,取决于外面的查询,即子查询依赖于外层的查询的结果。
- DERIVED: 衍生,表示导出表的SELECT(FRON子句的子查询)
- table: 表示该语句查询的表
4.⭐type:优化sql的重要字段,也是我们判断sql性能和优化程度的重要指标。他的取值类型范围:
- const:通过索引一次命中,匹配一行数据
- system:表中只有一行记录,相当于系统表
- eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配
- ref:非唯一性索引扫描,返回匹配某个值的所有
- range:只检索给定范围的行,使用一个索引来选择行,一般用between、<、>;
- index: 只遍历索引树
- ALL: 表示全表扫描,这个类型的查询是性能最差的查询之一。那么基本就是随着表的数量增多,执行效率越慢。
执行效率:
ALL < index < range < ref < eq_ref < const < system。最好是避免ALL和index
- possible_keus: 它表示Mysql在执行sql语句的时候,可能用到的索引信息,仅仅是可能,实际不一定会用到。
6.key:此字段是mysql在当前查询时所真正用到的索引。他是possible_keys的子集
7.key_len: 表示查询优化器使用了索引的字节数,这个字段可以评估组合索引是否完全被使用,这也是我们优化sql时,评估索引的重要指标。 - rows: mysq;查询优化器根据统计信息,估算该sql返回结果集需要扫描读取的行数,这个值相当重要,索引优化之后,扫描读取的行数越多,说明索引设置不对,或者字段传入类型之类的问题,说明要优化空间越大。
- filtered: 返回结果的行占需要读到的行(rows列的值)的百分比,就是百分比越高,说明需要查询到的数据越准确,百分比越小,说明查询到的数据量大,而结果集很少。
- extra
- using filesort: 表示mysql对结果集进行外部排序,不能通过索引排序达到排序效果。一般有using filesort都建议优化去掉,因为这样查询cpu资源消耗大,延时大。
- using index: 覆盖索引扫描,表示查询在索引树中就可查找所需数据,不用扫描表数据文件,往往说明性能不错。
- using temporary: 查询有使用临时表,一般出现于排序,分组和多表join的情况,查询效率不高,建议优化。
- using where: sql使用了where过滤,效率较高。
网友评论