EXPLAIN进阶:读懂key_len和filtered

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本篇精讲MySQL优化两大关键指标:**key_len**(揭示联合索引实际使用列数)与**filtered**(反映索引过滤效率)。说清原理、计算、诊断与实战优化,助你从“看懂EXPLAIN”进阶到“精准调优”。

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

做SQL优化就像体检。你拿到一份体检报告(EXPLAIN的输出),大部分人只盯着“红细胞”(type列)和“白细胞”(Extra列)有没有超标,却忽略了“关键蛋白”(key_len)和“炎症因子”(filtered)。这两个指标恰好能告诉你:联合索引到底用了几列?索引用得有多好?

key_len和filtered是什么?

  • key_len​:相当于你扫描条形码的长度。条形码越长,包含的信息越多(比如省、市、区、街道、门牌号)。key_len越大,说明联合索引中实际使用的列越多,查询定位越精准。
  • filtered​:相当于分拣员根据条形码初步分拣后,剩下的包裹中还需要人工二次分拣的比例。filtered越高(越接近100%),说明索引定位已经很准确,不需要额外过滤;filtered越低,说明索引只帮你筛掉了一小部分,还要花大量时间在回表后过滤剩下的数据。

一、key_len的计算方法

MySQL中各数据类型的字节长度如下表:

数据类型 字节长度 备注
TINYINT 1
SMALLINT 2
INT 4
BIGINT 8
DATE 3
TIMESTAMP 4
DATETIME 5 MySQL 5.6+
CHAR(n) n × 字符集字节数 utf8mb4为4字节/字符
VARCHAR(n) n × 字符集字节数 + 1~2 长度标识
允许NULL 额外+1

示例计算

假设联合索引 (a, b, c)

  • a:INT NOT NULL → 4字节
  • b:INT允许NULL → 4 + 1 = 5字节
  • c:VARCHAR(10) utf8mb4 NOT NULL → 10×4 + 2 = 42字节
使用列 key_len
只用a 4
a+b 4+5=9
a+b+c 4+5+42=51

实战案例

CREATE TABLE user_log (
  id INT PRIMARY KEY,
  user_id INT NOT NULL,
  log_date DATE NOT NULL,
  log_type TINYINT NOT NULL,
  msg VARCHAR(255),
  INDEX idx_union (user_id, log_date, log_type)
);
查询条件 key_len 说明
user_id = 10086 AND log_date = '2026-06-01' 4+3=7 用到前两列
user_id = 10086 AND log_type = 1 4 跳过了log_date,只能用到第一列(最左前缀原则)

二、filtered的解读

filtered表示存储引擎返回的行中,满足剩余WHERE条件的比例(估算值)。

filtered值 含义
100% 索引精准定位,无需额外过滤
30% 索引定位后还要过滤掉70%的行,回表开销大
5% 索引选择性很差,几乎没用
  • 在单表查询中​:filtered帮助判断索引设计是否合理。如果联合索引全用到但filtered仍然很低,说明索引列的选择性差(比如status只有几个值)。
  • 在多表JOIN中​:优化器会估算“驱动表行数 × filtered”作为被驱动表的匹配次数。filtered低可能导致优化器选择错误的驱动顺序。

三、key_len + filtered 组合分析矩阵

key_len filtered 诊断 优化建议
大(多列) 高(>90%) 索引设计优秀 无需调整
小(单列) 中低 查询条件未覆盖索引前列 调整联合索引列顺序或改写SQL
大(多列) 索引列选择性差 换用更高选择性的列,或使用覆盖索引
小(单列) 单列索引选择性好 可考虑扩展为联合索引,避免回表

四、真实优化案例

原SQL:

SELECT * FROM orders WHERE create_time > '2026-05-01' AND status = 'PAID';

原索引: (create_time, status)

EXPLAIN结果: type=range,key_len=5(create_time为DATE),filtered=10%。

分析: 只用了create_time索引,status过滤在回表后执行。filtered=10%意味着扫描行中90%被过滤掉,回表开销大。

优化方案: 将索引顺序改为 (status, create_time)。因为status选择性虽然不高,但作为前导列可以快速定位到PAID行,再通过create_time范围扫描。

优化后: key_len = status + create_time,filtered提升到100%,查询时间从3秒降到0.2秒。


五、注意事项

  1. key_len不是越大越好​:如果用了低选择性列,反而可能扫描更多行。
  2. filtered是估算值​:依赖统计信息。如果统计信息过旧,执行 ANALYZE TABLE 更新。
  3. 版本限制​:MySQL 5.6及以下版本没有filtered列。
  4. JOIN中的重要性​:驱动表的filtered值直接影响被驱动表的访问次数。

六、总结

学会解读key_len和filtered,你就能从“大概知道用了索引”升级到“精确知道索引怎么用的、哪里需要优化”。配合 ANALYZE TABLE 更新统计信息,让优化器做出更准确的决策,是DBA走向高级优化的必经之路。

小耶在手,SQL 不愁

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
24天前
|
人工智能 Cloud Native 关系型数据库
MySQL 8.4 LTS来了!从8.0到8.4,DBA必须知道的5个核心变化
MySQL 8.0社区版将于2026年结束生命周期,8.4 LTS作为首个长期支持版本,提供5年超长支持周期(至2031年)。本文从InnoDB并行查询、Redo Log动态容量、默认认证插件变更、参数默认值调整、云原生适配五个维度,梳理DBA升级前必须掌握的核心变化,并提供升级检查清单。
|
29天前
|
SQL 运维 自然语言处理
国产向量数据库有哪些?两大技术流派深度对比与选型指南
向量数据库是2026年数据库领域增长最快的细分赛道之一。本文从RAG应用和企业知识库的实际需求出发,系统梳理国产向量数据库的两大技术流派——独立向量数据库与融合型向量数据库,深入对比两者的架构差异、适用边界和选型逻辑。
|
1月前
|
SQL 人工智能 自然语言处理
Vibe Coding 是什么?当“感觉编程”遇上数据库
Vibe Coding是2026年编程圈最火的概念之一,指开发者通过自然语言描述“感觉”或“意图”,由AI自动生成代码、调试、优化。本文从Vibe Coding的起源讲起,分析它如何改变数据库开发方式:从手写SQL到自然语言查询、从人工调索引到AI推荐、从经验运维到智能诊断。探讨这项趋势对DBA职业的影响,并给出拥抱变化的实用建议。技术会变,但人的判断力、审美和业务理解才是长期竞争力。
|
22天前
|
SQL 关系型数据库 MySQL
事务隔离级别选错了,数据可能被“吞”掉——从脏读到幻读,一次讲透
事务隔离级别是数据库并发控制的核心机制,但很多开发者和DBA对脏读、不可重复读、幻读的区别一知半解,遇到问题只能“加锁试试”。本文从四个隔离级别出发,用真实SQL案例讲透三种并发问题的本质差异,对比MySQL与PostgreSQL在默认隔离级别上的不同选择,并结合业务场景给出选型建议,帮助读者写出更可靠的事务代码。
|
23天前
|
SQL 关系型数据库 MySQL
执行计划进阶:读懂统计信息与基数估算,理解优化器的“思考方式”
执行计划是SQL优化的核心工具,但很多人只关注type和Extra,忽略了执行计划背后的决策依据——统计信息与基数估算。本文从优化器的决策逻辑出发,解释统计信息如何影响基数估算、基数估算如何决定执行计划的选择。通过真实案例展示统计信息过旧如何导致优化器“选错路”,以及如何通过更新统计信息、使用扩展统计等方法来纠正。帮助读者从“看懂执行计划”进阶到“理解优化器为什么这么选”。
|
29天前
|
存储 SQL 缓存
InnoDB索引结构深潜:B+Tree与回表机制的底层逻辑
索引是SQL性能优化的核心,但很多人只停留在“建索引就能快”的层面,对索引的底层结构缺乏认知。本文从B+Tree的数据结构出发,深入讲解聚簇索引与二级索引的存储差异、回表机制的工作流程及代价分析、覆盖索引消除回表的原理。
|
28天前
|
SQL 安全 关系型数据库
死锁分析进阶:从日志到根因,一次搞定死锁排查
死锁是DBA最头疼的问题之一,但很多人看到SHOW ENGINE INNODB STATUS输出后仍然无从下手。本文从死锁的四种常见模式出发,拆解死锁日志的关键字段含义,建立从“发现死锁”到“定位根因”到“预防复发”的完整分析链。结合真实案例讲解如何识别不同表顺序、相同表不同条件、间隙锁、外键约束四类死锁的日志特征,并给出系统化的预防方法。
|
1月前
|
SQL 关系型数据库 MySQL
从索引设计到执行计划:一条慢查询的“体检”全流程
慢查询优化不是孤立地看执行计划,而是要从索引设计、执行计划解读、统计信息更新到SQL改写形成完整闭环。本文从一条真实的慢查询出发,串联索引设计原则、执行计划关键字段的诊断价值、统计信息对优化器的影响,以及验证优化的标准流程,帮助读者建立系统化的SQL性能优化方法论。
|
1月前
|
SQL 关系型数据库 MySQL
SQL优化进阶:读懂执行计划,告别慢查询焦虑
慢查询优化的第一步不是猜索引,而是读懂执行计划。本文从执行计划的生成原理出发,系统讲解type、key_len、rows、filtered、Extra五个核心字段的业务含义和诊断价值。通过典型案例揭示全表扫描、索引失效、文件排序、临时表等常见性能陷阱的判定方法,并给出标准化的优化排查流程。帮助开发者从“凭感觉优化”升级到“基于证据优化”。

热门文章

最新文章