MySQL的EXPLAIN
语句是一个非常有用的工具,用于分析SELECT语句的执行计划。通过EXPLAIN
,可以了解MySQL是如何处理你的SQL查询的,包括如何连接表、使用哪些索引等。这对于优化查询性能至关重要。下面是一些EXPLAIN
输出中最常见和重要的参数解释:
-
id: 查询的标识符。如果你执行的是一个简单的SELECT语句,那么它通常是1。对于包含子查询、UNION或复杂连接的查询,MySQL会为每个部分分配一个唯一的标识符。
-
select_type: 查询的类型。常见的类型包括SIMPLE(简单SELECT,不使用UNION或子查询等)、PRIMARY(查询中若包含任何复杂的子部分,最外层的SELECT被标记为PRIMARY)、UNION(UNION中的第二个或后续的SELECT语句)、SUBQUERY(子查询中的第一个SELECT)等。
-
table: 输出行所引用的表。
-
partitions: 匹配的分区。
-
type: 连接类型,显示了MySQL是如何找到所需行的。常见的类型包括ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(使用非唯一性索引或唯一性索引的前缀来查找单个行)、eq_ref(使用唯一性索引查找单个行的索引扫描)、const/system(表中只有一行匹配,等于系统表)。更高效的连接类型通常意味着更好的性能。
-
possible_keys: 显示可能应用在这张表上的索引,但这并不意味着实际查询中会用到它们。
-
key: 实际使用的索引。如果没有使用索引,则为NULL。
-
key_len: 使用的索引的长度。在某些情况下,不是索引的全部部分都会被使用。
-
ref: 显示索引的哪一列或常数被用于查找值。
-
rows: MySQL认为它必须检查的用来返回请求数据的行数。这是估算值,并不总是完全准确的。
-
filtered: 表示返回结果的行占开始找到的行(rows列的值)的百分比,这主要是依据表条件过滤的。
-
Extra: 包含不适合在其他列中显示但对执行计划非常重要的额外信息。例如,是否使用了文件排序(Using filesort),是否使用了临时表(Using temporary),是否使用了索引来避免全表扫描(Using index)等。