SQL 优化 - explain 的使用

通过关键字 explain 可以分析出:
1. 表的读取顺序
2. 表的读取操作的读取类型
3. 哪些索引有可能会被使用到
4. 哪些索引被实际使用了
5. 表之间的引用
6. 每张表有多少行被优化器查询

 

每个字段的含义:

1. id - id值越大,就越先被MySQL执行,如果id相同的话 可以认为是同一组,按照从上到下顺序执行。

2. select_type - 查询类型,是简单查询、子查询、主键查询等,具体类型如下:

SIMPLE(简单的SELECT语句)

PRIMARY(查询中最外层的SELECT)/UNION(查询中处于内层的SELECT)

DEPENDENT UNION(UNION操作中,查询中处于内层的SELECT)/UNIOIN RESULT(UNION操作的结果,id值通常为NUL)

SUBQUERY(子查询中首个SELECT)/DEPENDENT SUBQUERY(严重消耗性能)(子查询中首个SELECT,但依赖于外层的表)

DERIVED(被驱动的SELECT子查询)/MATERIALIZED(被物化的子查询)

UNCACHEABLE SUBQUERY(对于外层的主表,子查询不可被物化,每次都需要计算)/UNCACHEABLE UNION(UNION操作中,内层的不可被物化的子查询)

3. table - 该行所引用的表名

4. type - 显示了查询使用到了那种类型,从最优的查询到最差的排序为:索引type从优到差:System-->const-->eq_ref-->ref-->ref_or_null-->index_merge-->unique_subquery-->index_subquery-->range-->index-->all(全表扫描)

5. possible_key - 能会用到那些索引在该表中找到行级记录

6. key - 实际从 possible_key 选择使用的索引。如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情 况下,可以在 SELECT语句中使用 USE INDEX (indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制 MYSQL 忽略索引.

7. key_len - 使用的索引的长度。在不损失精确性的情况下,长度越短越好。

8. ref - 显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或者常量被用于查找索引列上的值。

9. rows - 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。

10. filtered - 显示了通过条件过滤出的行数的百分比估计值。

11. Extra - 就是除了以上MySQL要展示的重要的信息之外的一个附加信息,一般四种情况

Using filesort

Using temporary

Using index

Not exists

 

重要!
key、type 、rows、extra,其中 key 为 null 时,说明没有使用到索引,需要调整索引,type为all的地方,都是需要进行优化的地方.一般需要达到 ref级别,范围查找需要达到 range,extra有Using filesort、Using temporary 的一定需要优化,根据rows可以直观看出优化结果。

posted @ 2019-07-03 21:36  mykiya  阅读(1189)  评论(0编辑  收藏  举报