首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >explain的type几种类型详解

explain的type几种类型详解

原创
作者头像
用户3672714
发布2025-08-08 11:20:39
发布2025-08-08 11:20:39
19500
代码可运行
举报
运行总次数:0
代码可运行

你说的 EXPLAIN 的 type,一般是指 MySQL 查询执行计划中 EXPLAIN 输出里的 type 列。它表示 MySQL 选择的连接类型,也就是访问数据表的方式,直接反映查询效率。


MySQL EXPLAIN 中 type 的几种常见类型详解(从最好到最差排序)

类型

说明

性能评级

备注

system

表只有一行(系统表),这是最优访问类型,几乎没有成本。

最优

仅一行数据的表,极少见

const

表最多只有一行匹配,MySQL 将其作为常量读取。

非常好

主键或唯一索引查询,速度极快

eq_ref

对每个来自前一个表的行,使用唯一索引查找,最多返回一行。

很好

多表关联中常见,使用主键或唯一索引

ref

使用非唯一索引查找匹配的所有行,返回可能多于一行。

较好

常用索引扫描方式,性能不错

range

通过索引范围扫描访问,通常用于 >、<、BETWEEN、IN 等条件。

一般

扫描范围索引部分行,效率中等

index

全索引扫描,遍历整个索引。

较差

比全表扫描快(因为索引更小),但仍要遍历全索引

all

全表扫描,MySQL 从头到尾遍历整个表。

最差

当无合适索引时出现,最耗性能


具体说明

1. system

  • 表只有一条记录,MySQL 直接读取,没有任何扫描开销。

2. const

  • 通过主键或唯一索引定位单条数据。
  • 只查询一条记录,作为常量处理。

3. eq_ref

  • 多表连接中,针对前一表的每条记录用唯一索引查找对应行。
  • 常见于关联查询中的主键或唯一索引连接。

4. ref

  • 用非唯一索引查找满足条件的多行。
  • 返回多条记录。

5. range

  • 执行索引范围扫描,查找某范围内的索引值。
  • 典型场景如 WHERE col > 10

6. index

  • 遍历整个索引而不是数据表(注意 InnoDB 主键是聚簇索引,区别较大)。
  • 可能比全表扫描稍好。

7. all

  • 最差方式,执行全表扫描。
  • 通常因为无索引可用。

总结

  • 查询时尽量避免出现 all,保证有适当索引。
  • consteq_ref 和 ref 是理想访问方式,性能最好。
  • range 也可以接受,但要注意范围大小。
  • index 和 all 都是遍历,性能相对较差。

好的!这里帮你详细讲解 MySQL EXPLAIN 输出中其他几个关键字段的含义,以及它们对查询优化的帮助:


EXPLAIN 其他重要字段详解

字段名

说明

possible_keys

该查询可能用到的索引列表。显示所有 MySQL 认为可能用到的索引,但不一定实际使用。

key

实际使用的索引。如果是 NULL,说明没用到索引,通常性能较差。

key_len

使用的索引长度(字节数),表示 MySQL 实际利用了索引的多少列和多少字节。

ref

哪个列或常数与索引列比较。显示索引中被用来查找的列或常量。

rows

MySQL 估计要读取多少行数据,越小越好,直接影响查询速度。

Extra

额外信息,比较重要,可能包含:- Using index:使用覆盖索引,性能更好。- Using where:使用了过滤条件。- Using temporary:需要用临时表,可能是排序或分组。- Using filesort:需要额外排序,性能较差。


如何用这些字段辅助优化?

  • 确认索引是否被使用:看 possible_keys 和 key,若 possible_keys 有索引但 key 却是 NULL,考虑调整查询或索引。
  • 减少扫描行数rows 越少越好,表明访问数据少,索引命中率高。
  • 覆盖索引优化Extra 显示 Using index 说明查询只从索引里读取数据,不访问表数据,性能很好。
  • 避免临时表和文件排序Using temporary 和 Using filesort 通常是性能瓶颈,要尽量优化查询结构和索引,避免这些操作。

举例说明

代码语言:javascript
代码运行次数:0
运行
复制
EXPLAIN SELECT id, name FROM users WHERE age = 30;php50 Bytes© 菜鸟-创作你的创作

输出示例:

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

users

ref

age_index

age_index

4

const

100

Using where

  • possible_keys 有 age_index,表示这个索引可用。
  • key 是 age_index,实际用到了该索引。
  • type 是 ref,使用非唯一索引查找多行。
  • rows 估计 100 行数据要读取。
  • Extra 有 Using where,说明查询还需要额外过滤(age=30)。

好的!下面是一个指导你如何基于具体的 EXPLAIN 输出,逐步优化 SQL 查询的实战流程和建议。


基于 EXPLAIN 优化 SQL 查询的实战步骤

1. 观察 type 字段,尽量避免 ALL(全表扫描)

  • 如果是 ALL,说明没有用到索引,优先考虑为查询涉及的字段添加合适索引。
  • 对于范围查询(range)可以接受,但尽量缩小扫描范围。

2. 查看 key 字段,确认是否使用索引

  • key = NULL 表示没用索引,需优化。
  • 如果 possible_keys 有索引但未被使用,考虑:
    • 改写查询条件让索引生效。
    • 调整索引顺序,使用复合索引覆盖多个条件。

3. 注意 rows 字段,估计扫描行数应尽可能少

  • 如果很大,说明扫描了大量数据,考虑加筛选条件或索引。
  • 可以利用索引选择性高的列做条件过滤。

4. 关注 Extra 字段

  • Using filesort 表示 MySQL 需要额外排序,尽量避免。
  • Using temporary 表示使用临时表,可能是复杂的 GROUP BY 或 DISTINCT,需优化。
  • Using index 表示覆盖索引,查询效率高。
  • Using where 表示服务器端过滤,正常但越少越好。

5. 分析复合索引使用情况

  • 复合索引中前导列必须用于查询条件才能用上索引。
  • 多列索引能提高多条件过滤效率。

6. 避免在索引列上做函数、计算或类型转换

  • 这些操作会导致索引失效,变成全表扫描。

优化案例示范

假设你的查询:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT * FROM orders WHERE customer_id = 123 AND order_date > '2023-01-01' ORDER BY order_date DESC;php100 Bytes© 菜鸟-创作你的创作
  • EXPLAIN 显示:
    • type 是 ALLkey 是 NULLExtra 有 Using filesort

优化建议

  • 为 (customer_id, order_date) 建复合索引:CREATE INDEX idx_customer_orderdate ON orders(customer_id, order_date);
  • 复查 EXPLAIN,type 应变为 ref 或 rangekey 显示使用该索引,Using filesort 消失。

额外工具和技巧

  • 使用 ANALYZE TABLE table_name; 更新统计信息,帮助优化器更准确估计。
  • 用 SHOW INDEX FROM table_name; 查看现有索引情况。
  • 利用 EXPLAIN FORMAT=JSON 获得更详细执行计划。
  • 结合慢查询日志定位瓶颈。
  • https://www.52runoob.com/archives/5458

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL EXPLAIN 中 type 的几种常见类型详解(从最好到最差排序)
  • 具体说明
    • 1. system
    • 2. const
    • 3. eq_ref
    • 4. ref
    • 5. range
    • 6. index
    • 7. all
  • 总结
  • EXPLAIN 其他重要字段详解
  • 如何用这些字段辅助优化?
  • 举例说明
  • 基于 EXPLAIN 优化 SQL 查询的实战步骤
    • 1. 观察 type 字段,尽量避免 ALL(全表扫描)
    • 2. 查看 key 字段,确认是否使用索引
    • 3. 注意 rows 字段,估计扫描行数应尽可能少
    • 4. 关注 Extra 字段
    • 5. 分析复合索引使用情况
    • 6. 避免在索引列上做函数、计算或类型转换
  • 优化案例示范
  • 额外工具和技巧
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档