通过关键字 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可以直观看出优化结果。