MySQL 的 EXPLAIN
Extra 字段内容
在 MySQL 的 EXPLAIN
输出中,Extra
列提供了有关查询执行的额外信息。以下是 Extra
列中常见的内容及其含义:
Using where: 表示使用了 WHERE 子句来过滤行。
Using index: 表示查询只使用索引树中的信息而不需要进一步检索实际的行数据。
Using temporary: 表示 MySQL 需要创建一个临时表来处理查询,通常出现在排序或分组操作时。
Using filesort: 表示 MySQL 需要进行额外的排序操作,而不是直接从表中读取已排序的数据。
Using join buffer: 表示使用了连接缓冲区来优化全连接操作。
Distinct: 表示一旦找到与行相匹配的行,就不再搜索其他行。
Not exists: 表示 MySQL 优化了 LEFT JOIN,一旦找到了匹配的行,就不再为后续的行进行检查。
Range checked for each record (index map: N): 表示没有找到好的索引,MySQL 将检查每个记录并选择范围。
Using union buffer: 表示正在使用 UNION 缓冲区来存储中间结果。
Full scan on NULL key: 表示在某些情况下,MySQL 必须扫描所有记录以查找包含 NULL 值的行。
Using index condition: 表示使用了索引条件推送(ICP),即在存储引擎层过滤索引条目。
Using where with pushed condition: 表示查询优化器将部分 WHERE 条件推送到存储引擎层进行过滤。
FirstMatch (table_name): 表示在多表连接中,一旦找到匹配的行就停止搜索其他行。
LooseScan (M->N): 表示使用了 Loose Index Scan 策略来优化某些类型的聚合查询。
No tables used: 表示查询没有引用任何表,例如
SELECT 1;
这样的查询。Select tables optimized away: 表示查询被优化为常量表达式,不需要实际访问表。常见于某些聚合查询或子查询。
Skip_open_table, Open_frm_only, Open_full_table: 这些信息通常出现在查询缓存或表元数据操作中,表示不同的表打开策略。
End temporary: 表示结束临时表的使用。
Unique row not found: 表示在唯一索引查找中未找到匹配的行。
Impossible WHERE noticed after reading const tables: 表示在读取常量表后发现 WHERE 子句不可能为真。
No matching min/max row: 表示在执行 MIN/MAX 查询时没有找到匹配的行。
Start temporary: 表示开始使用临时表。
确实还有一些其他较少见但仍然重要的 EXPLAIN
的 Extra
列内容,以下是补充说明:
- Using join buffer (Block Nested Loop): 表示使用了块嵌套循环连接(BNL)算法,并且启用了连接缓冲区。
- Using join buffer (Batched Key Access): 表示使用了批处理键访问(BKA)算法,并且启用了连接缓冲区。
- Using index for filter: 表示查询优化器使用索引来过滤行,而不是直接读取表数据。
- Using where; Using temporary; Using filesort: 表示查询需要进行 WHERE 过滤、创建临时表和排序操作。这种情况通常表明查询性能可能较差,需要优化。
- Using index condition pushdown (ICP): 表示查询优化器将部分索引条件推送到存储引擎层进行过滤,以减少回表次数。
- Using rowid filter: 表示查询使用了行 ID 进行过滤。
- Using read-ahead: 表示 MySQL 使用了预读取机制来优化磁盘 I/O。
- Using MRR with sort buffer: 表示使用了 Multi-Range Read 优化,并结合了排序缓冲区。
- Using semi-join materialization: 表示在半连接查询中使用了物化技术。
- Using intersect (index_list): 表示在多个索引上使用了交集操作。
- Using sort_union (index_list): 表示在 UNION 查询中使用了索引进行排序。
- Using union buffer: 表示正在使用 UNION 缓冲区来存储中间结果。
此外,还有一些与特定存储引擎或查询类型相关的标记:
InnoDB-specific:
- Using adaptive hash index: 表示 InnoDB 使用了自适应哈希索引来加速查询。
- Using clustered key: 表示使用了聚簇索引(主键索引)。
MyISAM-specific:
- Using key cache: 表示 MyISAM 使用了键缓存来加速索引访问。
这些信息虽然不常见,但在特定情况下可以帮助你更好地理解查询的执行计划和潜在的优化点。如果你有具体的 EXPLAIN
输出或查询性能问题,可以提供更多信息,我可以帮助你进行更详细的分析。
- Using index for group-by: 表示使用索引来优化 GROUP BY 操作,而不需要额外的排序或临时表。
- Using MRR: 表示使用了 Multi-Range Read 优化,通过更高效地读取多个范围的数据来提高性能。
- Using sort_union (index_list): 表示在 UNION 查询中使用了索引进行排序。
- Using intersect (index_list): 表示在多个索引上使用了交集操作。
- Using where for key lookup: 表示在主键或唯一索引查找中使用了 WHERE 子句。
- Full scan on NULL key: 表示在某些情况下,MySQL 必须扫描所有记录以查找包含 NULL 值的行。
- Impossible HAVING: 表示 HAVING 子句总是为假,导致没有行被返回。
- No matching min/max row: 表示在执行 MIN/MAX 查询时没有找到匹配的行。
- Select tables optimized away: 表示查询被优化为常量表达式,不需要实际访问表。常见于某些聚合查询或子查询。
- Unique row not found: 表示在唯一索引查找中未找到匹配的行。
此外,还有一些较为特殊的标记:
Zero limit: 表示 LIMIT 设置为 0,导致查询不会返回任何行。
End of range removal optimization: 表示在某些情况下,优化器移除了不必要的范围条件。
Start temporary table for subquery: 表示为子查询创建了临时表。
End temporary table for subquery: 表示结束为子查询创建的临时表。
Materialize: 表示将子查询的结果物化为临时表。
Materialize from table function: 表示从表函数物化结果。
FirstMatch (table_name): 表示在多表连接中,一旦找到匹配的行就停止搜索其他行。
LooseScan (M->N): 表示使用了 Loose Index Scan 策略来优化某些类型的聚合查询。
Using join buffer (Block Nested Loop): 表示使用了块嵌套循环连接(BNL)算法,并且启用了连接缓冲区。
Using join buffer (Batched Key Access): 表示使用了批处理键访问(BKA)算法,并且启用了连接缓冲区。
Using index for filter: 表示查询优化器使用索引来过滤行,而不是直接读取表数据。
Using where; Using temporary; Using filesort: 表示查询需要进行 WHERE 过滤、创建临时表和排序操作。这种情况通常表明查询性能可能较差,需要优化。
Using index condition pushdown (ICP): 表示查询优化器将部分索引条件推送到存储引擎层进行过滤,以减少回表次数。
Using rowid filter: 表示查询使用了行 ID 进行过滤。
Using read-ahead: 表示 MySQL 使用了预读取机制来优化磁盘 I/O。
Using MRR with sort buffer: 表示使用了 Multi-Range Read 优化,并结合了排序缓冲区。
Using semi-join materialization: 表示在半连接查询中使用了物化技术。
Using intersect (index_list): 表示在多个索引上使用了交集操作。
Using sort_union (index_list): 表示在 UNION 查询中使用了索引进行排序。
Using union buffer: 表示正在使用 UNION 缓冲区来存储中间结果。
此外,还有一些与特定存储引擎或查询类型相关的标记:
InnoDB-specific:
- Using adaptive hash index: 表示 InnoDB 使用了自适应哈希索引来加速查询。
- Using clustered key: 表示使用了聚簇索引(主键索引)。
MyISAM-specific:
- Using key cache: 表示 MyISAM 使用了键缓存来加速索引访问。
这些信息虽然不常见,但在特定情况下可以帮助你更好地理解查询的执行计划和潜在的优化点。如果你有具体的 EXPLAIN
输出或查询性能问题,可以提供更多信息,我可以帮助你进行更详细的分析。