MySQL EXPLAIN 结果表详解

列名 含义 常见取值及解释
id 查询的唯一标识符。 通常是一个数字。对于复杂的查询(如包含子查询或 UNION),每个查询部分会有一个独立的 id
select_type 查询的类型。 SIMPLE: 简单查询,不包含 UNION 或子查询。<br>PRIMARY: 包含子查询或 UNION 的最外层查询。<br>SUBQUERY: SELECTWHERE 子句中的子查询。<br>UNION: UNION 中的第二个或随后的 SELECT 语句。
table 正在访问的表名。 表名或别名。如果是派生表(derived),会显示为 <derivedN>,其中 Nid
partitions 匹配的分区。 对于分区表,显示查询所匹配的分区。如果未分区,该值为 NULL
type 访问类型,是优化的关键。 ALL: 全表扫描,性能最差。<br>index: 全索引扫描,比 ALL 好,但仍需扫描整个索引树。<br>range: 范围扫描,通过索引检索指定范围的行,性能良好。<br>ref: 非唯一性索引扫描,找到多条匹配记录,性能良好。<br>eq_ref: 唯一性索引扫描,通常用于连接(join)操作,性能极佳。<br>const / system: 通过常量值进行匹配,只返回一行数据,性能最好。
possible_keys 可能使用的索引。 列出 MySQL 认为可能可以用于查找的索引。这只是一个候选列表,不代表最终使用。
key 实际使用的索引。 NULL: 没有使用任何索引,通常表示需要优化。<br>索引名:实际使用的索引名称。如果这个值在 possible_keys 中,说明优化器做出了正确的选择。
key_len 实际使用的索引的长度。 表示索引中使用的字节数。对于复合索引,这个值可以帮助你判断索引使用了多少列。
ref 索引中使用的列或常量。 显示与 key 列中的索引作比较的列或常量。例如,constdb.table.column
rows 估计要扫描的行数。 MySQL 估计的为了找到所需数据而需要读取的行数。这个值越小越好。
filtered 通过表条件过滤的行百分比。 估计表或连接后,通过 WHERE 条件过滤后剩余的行数百分比。值越高越好。
Extra 额外信息。 Using index: 覆盖索引,查询的所有数据都能在索引中找到,无需回表,性能极佳。<br>Using where: MySQL 使用 WHERE 子句来过滤结果。<br>Using filesort: MySQL 对结果进行排序,但无法通过索引完成,性能较差。<br>Using temporary: MySQL 创建了临时表来处理查询,通常是由于 GROUP BYORDER BY 无法利用索引,性能差。
posted @ 2025-08-20 11:11  talentzemin  阅读(9)  评论(0)    收藏  举报