Mysql中explain各字段的解释

尘微 2023-02-20 00:39:47 10744 0 0 0

explain的用法:

explain select * from gateway_apps;

返回结果:

图片alt

下面对上面截图中的字段一一解释:

1、id:select 查询序列号。id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行。
2、select_type:查询数据的操作类型,其值如下:

* simple:简单查询,不包含子查询或 union
* primary:包含复杂的子查询,最外层查询标记为该值
* subquery:在 select 或 where 包含子查询,被标记为该值
* derived:在 from 列表中包含的子查询被标记为该值,MySQL 会递归执行这些子查询,把结果放在临时表
* union:若第二个 select 出现在 union 之后,则被标记为该值。若 union 包含在 from 的子查询中,外层 select 被标记为 derived
* union result:从 union 表获取结果的 select

3、table:显示该行数据是关于哪张表
4、partitions:匹配的分区
5、type:表的连接类型,其值,性能由高到底排列如下:

* system:表只有一行记录,相当于系统表
* const:通过索引一次就找到,只匹配一行数据
* eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常用于主键或唯一索引扫描
* ref:非唯一性索引扫描,返回匹配某个单独值的所有行。用于=、< 或 > 操作符带索引的列
* range:只检索给定范围的行,使用一个索引来选择行。一般使用between、>、<情况
* index:只遍历索引树
* ALL:全表扫描,性能最差

注:前5种情况都是理想情况的索引使用情况。通常优化至少到range级别,最好能优化到 ref
6、 possible_keys:显示 MySQL 理论上使用的索引,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。如果该值为 NULL,说明没有使用索引,可以建立索引提高性能
7、key:显示 MySQL 实际使用的索引。如果为 NULL,则没有使用索引查询
8、key_len:表示索引中使用的字节数,通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好 显示的是索引字段的最大长度,并非实际使用长度

9、ref:显示该表的索引字段关联了哪张表的哪个字段
10、 rows:根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好
11、filtered:返回结果的行数占读取行数的百分比,值越大越好
12、extra:包含不合适在其他列中显示但十分重要的额外信息,常见的值如下:

* using filesort:说明 MySQL 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。出现该值,应该优化 SQL
* using temporary:使用了临时表保存中间结果,MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。出现该值,应该优化 SQL
* using index:表示相应的 select 操作使用了覆盖索引,避免了访问表的数据行,效率不错
* using where:where 子句用于限制哪一行
* using join buffer:使用连接缓存
* distinct:发现第一个匹配后,停止为当前的行组合搜索更多的行

注意:出现前 2 个值,SQL 语句必须要优化。