Loading

MYSQL语句优化之explain

一、explain

explain select * from users;

各列的含义如下:

id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.

select_type: SELECT 查询的类型.

table: 查询的是哪个表

partitions: 匹配的分区

type: 联接类型

possible_keys: 此次查询中可能选用的索引

key: 此次查询中确切使用到的索引.

ref: 哪个字段或常数与 key 一起被使用

rows: 显示此查询一共扫描了多少行. 这个是一个估计值.

filtered: 表示此查询条件所过滤的数据的百分比

extra: 额外的信息

1 详细介绍

1、1 select_type

表示了查询的类型, 它的常用取值有:

SIMPLE, 简单的SELECT(不使用UNION或子查询)

PRIMARY, 表示此查询是最外层的查询

UNION, 表示此查询是 UNION 的第二或随后的查询

DEPENDENT UNION, UNION 中的第二个或后面的查询语句, 取决于外面的查询

UNION RESULT, UNION 的结果

SUBQUERY, 子查询中的前 SELECT个

DEPENDENT SUBQUERY: 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果.

1、2 table

表示查询涉及的表或衍生表

1、3 partitions

查询将从中匹配记录的分区,对于非分区 table,该值为NULL

1、4 type

它提供了判断查询是否高效的重要依据依据. 通过 type 字段, 我们判断此次查询是 全表扫描 还是 索引扫描 等.

system 该 table 只有一行(=系统 table)。

const 该 table 最多具有一个匹配行,该行在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。

eq_ref 此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是=, 查询效率较高

ref 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引的查询.

index_merge 使用索引合并优化

range 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中.

index 表示全索引扫描(full index scan), 和 ALL 类型类似, 只不过 ALL 类型是全表扫描, 而 index 类型则仅仅扫描所有的索引, 而不扫描数据.

ALL: 表示全表扫描, 这个类型的查询是性能最差的查询之一.

fulltext 使用全文索引执行连接。

type 性能排序:

ALL < index < range ~ index_merge < ref < eq_ref < const < system

1、5 possible_keys

表示 MySQL 在查询时, 能够使用到的索引.

1、6 key

此字段是 MySQL 在当前查询时所真正使用到的索引.

1、7 key_len

表示查询优化器使用了索引的字节数. 这个字段可以评估组合索引是否完全被使用, 或只有最左部分字段被使用到.

1、8 ref

显示将哪些列或常量与key列中命名的索引进行比较,以从 table 中选择行。

如果值为func,则使用的值是某个函数的结果。

1、9 rows

估算 SQL 要查找到结果集需要扫描读取的数据行数

这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好.

1、10 Extra

Explain 中的很多额外的信息会在 Extra 字段显示,常见:

Using filesort 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大.

Using index "覆盖索引扫描", 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错

Using temporary 查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化.

Using where mysql服务器将在存储引擎检索行后再进行过滤。

二、EXPLAIN ANALYZE

EXPLAIN ANALYZE是一个用于查询的分析工具,它向用户显示MySQL在查询上花费的时间以及原因。

它将产生查询计划,并对其进行检测和执行,同时计算行数并度量执行计划中不同点上花费的时间。执行完成后,EXPLAIN ANALYZE将输出计划和度量结果,而不是查询结果。

posted @ 2022-02-21 16:51  Allfuture  阅读(77)  评论(0编辑  收藏  举报