EXPLAIN进阶:读懂key_len和filtered

本文涉及的产品
PolarSearch,搜索节点 4核8GB
PolarDB Agent Flow,2核4GB
RDS AI 助手,专业版
简介: 本篇精讲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 不愁

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

相关文章
|
1月前
|
SQL 关系型数据库 MySQL
一张5000万行的表,加索引从45秒到0.02秒——索引设计你真的会吗
本文实测5000万订单表:无索引查询45秒,加索引后仅0.02秒(提升2250倍)。详解索引原理、建索引时机、联合索引最左前缀、覆盖索引及隐式转换陷阱,干货不啰嗦!
|
2月前
|
SQL 数据库 数据库管理
写完SQL先别跑,这两步能救你一晚
我是小耶,专注踩坑与填坑,今天分享SQL性能关键:数据库执行顺序(FROM→WHERE→…)与人脑思维的错位——切忌先JOIN后过滤!用实例对比,教你“过滤前置”提速技巧。养成自查习惯,SQL轻松快一倍!
|
2月前
|
SQL JSON 关系型数据库
慢SQL排查三板斧:SHOW PROCESSLIST + 慢查询日志 + EXPLAIN 实战
教你三招快速定位CPU 100%元凶:SHOW PROCESSLIST查活跃查询、开启慢日志+mysqldumpslow分析、EXPLAIN深度诊断SQL性能。干货不啰嗦,专治线上急症!
|
26天前
|
SQL 运维 关系型数据库
DBA必备技能:MySQL误删恢复完全指南(全量备份+binlog回放)
本文详解误删数据(如`DELETE FROM orders`)后的紧急恢复三步法:查Binlog→临时库回放→差异导回,并附4条血泪预防措施。不讲段子,只教能救命的操作!
|
2月前
|
SQL 数据库
多表关联查询入门:LEFT JOIN、INNER JOIN一文搞懂|转行学DB第6天
本文通俗易懂地讲解了数据库多表查询的三种JOIN操作:INNER JOIN(内连接)只返回两表匹配的数据,适用于查询交集数据;LEFT JOIN(左连接)保留左表所有记录并匹配右表数据,适用于查询主表完整信息;RIGHT JOIN(右连接)则保留右表所有记录。
|
2月前
|
SQL 关系型数据库 MySQL
主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天
本文用通俗易懂的语言讲解了主键(数据的唯一标识)、外键(表间关联)以及唯一约束、非空约束等其他常见约束规则。通过具体SQL示例展示了各种约束的使用方法,并分享了新手容易踩的坑和实用建议。
|
2月前
|
SQL 人工智能 安全
AI圈开始“养马”了?聊聊龙虾退位、爱马仕登基
AI智能体“龙虾”(OpenClaw)的衰落与“爱马仕”(Hermes Agent)的崛起:前者因API限策与高危漏洞(CVSS 9.9)式微;后者以持久记忆、技能自生成、跨平台互通等实用能力破圈,成技术圈新“拐杖”。但技术无银弹,懂你的工具才是真助力。
|
11天前
|
SQL 存储 关系型数据库
覆盖索引:让你的查询直接从索引返回,彻底告别回表
覆盖索引是SQL优化中性价比较高的技巧,让查询直接从索引返回所需列,避免回表操作。本文解释覆盖索引的原理,通过EXPLAIN的“Using index”判断是否生效。结合复合索引设计、深分页优化(延迟关联)等场景,给出覆盖索引的使用方法和注意事项。用好覆盖索引,不改SQL逻辑,仅调整索引设计即可显著提升查询性能。
|
2月前
|
SQL 数据库 数据库管理
从运营到DBA,我用了这3个“偷懒”方法学SQL
用运营人思维教小白轻松学SQL:①把SQL当Excel对话,理解SELECT/FROM/WHERE;②建“报错翻译本”,快速定位解决错误;③用“填空题法”抄改练,复用模板上手。不求完美,先跑通、看懂、不崩溃!
从运营到DBA,我用了这3个“偷懒”方法学SQL
|
1天前
|
存储 运维 监控
云上故障排查链路太长?试试链路监控+智能诊断
本文分享DBA在云环境踩过的坑:黑盒监控难、根因定位长、成本易失控。结合国产云数据库方案,教你从“救火”转向“预防”,掌握监控解读、架构设计与成本优化三大新能力。