mysql索引
在 MySQL 中,通过 EXPLAIN
关键字可以分析查询语句的执行计划,其中返回的各个字段都有特定含义。以下是常见字段的解释:
常见字段解释
字段名 | 含义 |
---|---|
id | 查询执行的序列号,标识查询中的步骤。通常,数字越大,表示优先级越低。对于复杂的查询(如子查询或联合查询),会有多个 id 值。 |
select_type | 查询的类型,表示当前查询的具体操作类型。常见值包括:- SIMPLE :简单查询,无子查询或联合查询。- PRIMARY :主查询(外层查询)。- SUBQUERY :子查询。- UNION :联合查询的第二个或之后的查询。 |
table | 正在访问的表的名称或别名。 |
partitions | 如果使用了分区表,这里会显示查询涉及的分区。 |
type | 访问类型,表示查询中表的访问方式,从效率低到高排列为:- ALL :全表扫描。- index :索引全扫描。- range :范围扫描。- ref :使用普通索引查询。- eq_ref :唯一索引查询,效率较高。- const /system :仅查询一行,效率最高。 |
possible_keys | 查询中可能用到的索引,列出 MySQL 认为可以优化该查询的索引列表。 |
key | 实际使用的索引名称。如果是 NULL ,表示未使用索引。 |
key_len | 使用索引的长度(字节数),显示索引中实际参与查询的字段的长度。 |
ref | 显示索引列与查询条件中的哪些列或常量进行比较。例如:const 表示和常量值比较。 |
rows | 估算的扫描行数,表示 MySQL 预计需要读取的行数,用来评估查询的开销。 |
filtered | 表示返回的行数占扫描行数的百分比。例如,filtered=50 表示 50% 的行符合查询条件。 |
Extra | 其他执行信息。常见值包括:- Using index :查询只使用了索引,不需要访问表的数据。- Using where :需要额外过滤条件。- Using temporary :使用了临时表。- Using filesort :需要额外的排序操作。 |
字段详细说明
-
type
(访问类型)ALL
:全表扫描,性能最差。index
:扫描索引,比全表扫描快,但仍需要读取索引中的所有值。range
:索引范围扫描,用于<
,>
,BETWEEN
,IN
等条件。ref
:非唯一索引查询,匹配一个或多个值。eq_ref
:使用唯一索引,返回单条记录,效率较高。const/system
:仅需读取一行即可,通常发生在主键或唯一索引查询中。
-
key
(实际使用的索引)- 显示查询中实际用到的索引名称。如果是
NULL
,表示查询未使用任何索引。
- 显示查询中实际用到的索引名称。如果是
-
key_len
(索引长度)- 表示查询中使用的索引部分的字节长度。通过它可以判断查询是否充分利用了索引。
- 例如:对索引字段
VARCHAR(50)
进行查询,如果查询只用到了前 10 个字符,则key_len
可能为 30 字节(假设字符集为utf8
)。
-
rows
(扫描行数)- MySQL 优化器估算的行数。通常
rows
值越小,查询性能越好。
- MySQL 优化器估算的行数。通常
-
Extra
(额外信息)Using index
:说明查询使用了覆盖索引,不需要回表查询。Using where
:表示查询还需要通过WHERE
条件进行过滤。Using temporary
:说明查询使用了临时表,通常出现在分组或排序操作中。Using filesort
:表示 MySQL 需要额外的排序步骤,不是通过索引完成的,性能较低。
优化查询的目标
- 减少
rows
值:通过索引限制扫描的行数。 - 提升
type
的级别:优先使用高效的访问类型(如const
,eq_ref
,ref
)。 - 避免
Extra
中的临时表和文件排序:优化查询和索引设计,尽量避免出现Using temporary
和Using filesort
。 - 充分利用索引:确保
key
字段显示了合适的索引,并且key_len
表示完整使用了索引。
通过分析执行计划的字段,可以发现查询中的瓶颈,并通过索引设计和 SQL 调优提高查询性能。
握不住的沙,那就顺手扬了它
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通