mysql explain有啥字段 字段含义?

1 个回答

  • 小鹏王
    在漆黑的夜里,你需要一道光照亮夜行的路,我燃烧了我自己,但也造就了你我不能相拥。
    # EXPLAIN 列及含义 * id:查询中执行单元的编号。数字越大越先执行;相同 id 按 from 左到右。 * select\_type:当前行所处的查询类型 SIMPLE(无子查询)、PRIMARY(最外层)、SUBQUERY、DEPENDENT SUBQUERY(相关子查询)、UNION、DEPENDENT UNION、UNION RESULT、DERIVED(派生表/子查询作为临时表)、MATERIALIZED(物化子查询/半连接物化)等。 * table:正在访问的表或别名;如为 `<derivedN>` 表示第 N 行派生表结果。 * partitions:命中哪些分区;未分区或未用分区时为 NULL。 * type:访问方式(从好到差大致排序) system > const > eq\_ref > ref > range > index > all 含义简述: system/const:常量表(最多一行);eq\_ref:主键/唯一键等值连接;ref:普通索引等值;range:范围扫描;index:全索引扫描;all:全表扫描。 * possible\_keys:可能使用到的索引列表。为空说明没有可用索引。 * key:实际选中的索引。为 NULL 说明未用索引。 * key\_len:实际使用到的索引前缀长度(字节)。可用来判断是否用到复合索引的哪些列或前缀索引长度。注意可空列会多 1 字节保存 NULL 标志;变长类型还包含长度字节。 * ref:与 key 一起使用的比较对象(如 `const`、`func`、`db.tbl.col`),反映等值条件的另一侧是谁。 * rows:优化器估算本表需要读取的行数(不是返回行数)。多表连接时,整体行检查量大致是各行的 rows 连乘。 * filtered:估算在本表条件过滤后保留下来的比例(百分比)。估算参与下一表连接的行数 ≈ rows × filtered/100。 * Extra:额外信息,常见取值见下文。 # Extra 常见取值速查 * Using where:读取后仍需服务器层做条件过滤(没完全靠索引)。 * Using index:仅访问覆盖索引即可得到所需列(覆盖索引),无回表。 * Using index condition:使用 Index Condition Pushdown(ICP,索引条件下推),先用索引前缀过滤再回表。 * Using temporary:使用临时表(常见于 `GROUP BY`、`DISTINCT`、复杂 `ORDER BY`)。 * Using filesort:需要额外排序(与“磁盘”无必然关系,内存也会显示这个词)。 * Using join buffer (Block Nested Loop):使用连接缓冲区(BNL),通常因为被驱动表无法用上合适索引。 * Range checked for each record:对驱动表的每行动态评估可用范围索引(说明统计或索引设计不佳)。 * Select tables optimized away/const row not found:通过常量折叠或聚合直出。 * Start temporary; End temporary / LooseScan:半连接策略(如 `IN (subquery)` 的去重/松散扫描)。 * Impossible WHERE / No matching rows:条件不可能成立/无匹配行。 # 读值要点与判断建议 1. 先看 type:尽量让关键表达到 `ref/eq_ref/const`,避免 `all/index`。 2. 核对 key 与 possible\_keys:若有可用更优索引却未选中,考虑统计信息、提示(hint)或索引顺序。 3. 看 key\_len:是否用足了复合索引的前导列次序,是否因可空/前缀设置导致利用不充分。 4. rows × filtered:估算联接级联后的数据放大;rows 很大或 filtered 很低通常要优化条件或索引。 5. Extra 出现 `Using temporary/Using filesort/Using join buffer` 多半意味着可从索引、SQL 改写或合适的排序键中优化。 # JSON 版 EXPLAIN(`EXPLAIN FORMAT=JSON`)关键字段 * query\_block / table / access\_type:分别对应执行块、表、访问方式(与 type 类似)。 * attached\_condition / pushed\_down\_condition:实际生效的过滤条件及是否下推。 * rows\_examined\_per\_scan、rows\_produced\_per\_join:更细的行数估计。 * cost\_info:prefix\_cost、read\_time、eval\_time、data\_read\_per\_join 等成本估算。 * used\_columns、using\_index、using\_temporary\_table、using\_filesort:可读性更好。 # 实跑版(8.0.18+) * `EXPLAIN ANALYZE <SQL>`:返回真实执行计划与实际耗时/实际行数/回表次数等,优先用于验证估算偏差与定位瓶颈。
    发布于 2025-08-18 17:00 •IP属地 上海
    举报
    评论
    收藏