当你使用 MySQL 的 EXPLAIN 命令来分析你的 SQL 查询时,这个工具会提供一个查询计划,显示了 MySQL 如何执行你的 SQL 查询。这对于理解性能瓶颈和优化查询非常有帮助。以下是 EXPLAIN 输出中每个字段的详细解释:
1. id
查询中的选择标识符。在复杂查询中,每个SELECT关键字都对应一个唯一的ID。单表查询通常为 1。
2. select_type
查询类型。有多种类型,如
SIMPLE(简单的SELECT,不使用子查询或UNION)、PRIMARY(查询中最外层的SELECT)、SUBQUERY(子查询中的第一个SELECT)、等等。
3. table
输出行所引用的表名。在复合查询中,可能会显示为临时表。
4. partitions
查询涉及的分区信息。对于未分区的表,此列为 NULL。
5. type
访问类型,显示了 MySQL 如何查找表中的行。常见类型包括:
system:表只有一行(等同于系统表)。这是最快的。const:使用主键或唯一索引读取一行。适用于比较索引和常数。eq_ref:对于每个来自前一个表的行,从此表中读取一行。使用主键或唯一索引。ref:非唯一索引的参与。range:检索给定范围的行。index:只通过索引来检索数据,不访问表的其它部分。ALL(全表扫描):最慢的访问类型。
6. possible_keys
显示可能被此查询使用到的索引。
7. key
实际使用的索引。如果没有使用索引,则为 NULL。
8. key_len
使用的索引的最长可能的键长度。显示的是索引中使用的字节数。
9. ref
显示使用索引的列或常数。用于索引键的比较。
10. rows
预计要检查的行数,帮助评估查询的成本。
11. filtered
表示返回结果的行占扫描行的百分比。
12. Extra
包含重要的额外信息,如:
Using index:表示查询能够仅使用索引中的信息来获取数据,无需额外访问表。Using where:表示使用了 WHERE 子句。Using temporary:表示使用了临时表,通常出现在需要对数据进行排序或合并操作的查询中。Using filesort:表示 MySQL 将在内存或磁盘上进行额外的排序操作,这通常不使用索引。
理解 EXPLAIN 的输出可以帮助你优化查询,改进数据库的性能。