EXPLAIN
是 MySQL 中用于显示查询执行计划的关键字,它可以帮助你理解 MySQL 是如何执行你的查询的。EXPLAIN
返回的结果包含多列信息,每一列都提供了关于查询执行的不同方面的信息。下面是 EXPLAIN
返回结果中各项的含义:
1. id
- 含义:查询标识符,表示查询中每个子查询或者查询的序列。
- 说明:如果查询包含子查询或者 UNION 查询,每个子查询都有一个唯一的标识符。主查询的标识符为 1,依此类推。
2. select_type
- 含义:查询的类型。
- 说明:常见的查询类型有:
SIMPLE
:简单查询,不包含子查询或 UNION。PRIMARY
:查询中的最外层查询。SUBQUERY
:子查询。UNION
:UNION 查询。- 等等。
3. table
- 含义:查询涉及的表。
- 说明:显示了查询中涉及的每个表的名称。
4. partitions
- 含义:查询中涉及的分区。
- 说明:如果表是分区表,并且查询只涉及特定分区,则会显示分区信息。
5. type
- 含义:访问类型,表示 MySQL 在表中找到所需行的方式。
- 说明:常见的访问类型有:
const
:通过常量条件查询,最多只能返回一行数据。eq_ref
:使用唯一索引查找,通常出现在连接查询中。ref
:非唯一索引查找,返回匹配某个值的所有行。range
:范围扫描,使用索引返回某个范围内的行。index
:全表扫描,遍历整个索引查找数据。- 等等。
6. possible_keys
- 含义:可能用到的索引。
- 说明:显示了 MySQL 认为可以在该表上使用的索引的列表。这些索引是可以加速查询的索引。
7. key
- 含义:实际使用的索引。
- 说明:显示 MySQL 实际选择用来执行查询的索引。如果为
NULL
,表示没有使用索引,将执行全表扫描。
8. key_len
- 含义:使用的索引长度。
- 说明:显示了 MySQL 在索引中使用的字节数。这是一个重要的指标,可以帮助你评估索引的效率和使用情况。
9. ref
- 含义:索引引用。
- 说明:显示了 MySQL 使用索引查找时使用的列或常量。通常与索引列的比较条件相关。
10. rows
- 含义:估计要检查的行数。
- 说明:显示了 MySQL 估计需要扫描的行数。这个值越小越好,表示查询效率更高。
11. filtered
- 含义:过滤器。
- 说明:显示了查询的条件过滤率,即最后返回结果的行数占查询检索的行数的百分比。
12. Extra
- 含义:额外的信息。
- 说明:显示了关于查询执行的其他信息,如使用的排序方式、使用的临时表、是否使用了文件排序等。
示例解释
下面是一个示例 EXPLAIN
返回结果:
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | users | NULL | ref | idx_username | idx_username | 302 | const | 10 | 100.00 | Using index |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
这个结果表示:
- 查询标识符为 1,表示这是主查询。
- 查询类型为
SIMPLE
,表示这是一个简单的查询。 - 查询涉及的表为
users
。 - 访问类型为
ref
,使用了idx_username
索引。 - 使用的索引是
idx_username
,索引长度为 302 字节。 - 参考值是
const
,表示使用了常量引用。 - 估计扫描的行数为 10 行,过滤率为 100%。
- 使用了索引来加速查询 (
Using index
)。
通过分析 EXPLAIN
返回的结果,可以深入了解 MySQL 是如何执行你的查询,并进行性能优化。