如何利用MySQL EXPLAIN工具分析索引是否达到了预期的过滤效果?

千敏同学_3643

千敏同学_3643

2026-07-27

933人浏览

原创

explain的key非null不等于索引真正生效,须结合type(如all/index表示未有效过滤)、rows(接近总行数说明扫描量大)和extra(如using filesort表明排序未走索引)综合判断。

如何利用mysql explain工具分析索引是否达到了预期的过滤效果?

EXPLAIN 的 key 字段不等于索引真生效了

很多人看到 EXPLAIN 输出里 key 列有值,就以为索引“起作用了”。其实 key 只表示优化器“计划用哪个索引”,不是执行时真的靠它过滤了数据。真正判断过滤效果,得看另外三个字段:type、rows、Extra。

常见误判场景:

  • type 是 index 或 ALL:说明在遍历整个索引或整张表,没做有效行数削减
  • rows 接近表总行数(比如 10 万行的表,rows=98234):即使 key 非空,也可能只是用来排序或覆盖,没减少扫描量
  • Extra 出现 Using filesort 或 Using temporary:常意味着索引无法满足 ORDER BY 或 GROUP BY,被迫回表或建临时表

重点盯住 type 字段的访问级别

type 是判断索引过滤能力最直观的指标,从好到差大致是:const ≈ eq_ref > ref > range > index > ALL。只要掉到 range 以下,基本说明索引没起到预期的“定位+过滤”作用。

典型问题与对应原因:

  • 本该走 ref 却变成 range:检查 WHERE 条件是否对索引列做了函数操作,例如 WHERE YEAR(create_time) = 2023 —— 这会让索引失效
  • 联合索引只用上左边几列,但跳过了中间列:比如索引是 (a,b,c),而条件是 WHERE a = 1 AND c = 3,则 b 之后的部分无法利用
  • type 是 index 且 rows 很大:说明 MySQL 正在全量遍历二级索引,可能需要考虑覆盖索引,或收缩查询字段范围

当优化器选错索引时,FORCE INDEX 是快速验证手段

MySQL 优化器依赖统计信息选索引,但统计可能过期、不准,尤其在数据倾斜、小表 join 大表等场景下,它会“自信地选错”。这时加 FORCE INDEX 不是为了长期上线,而是为了快速验证:如果强制指定后 rows 显著下降、type 提升到 ref 或更好,那大概率是优化器误判,后续应更新统计信息或调整索引设计。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

示例写法:

EXPLAIN SELECT * FROM orders FORCE INDEX (idx_customer_status) WHERE customer_id = 12345 AND status = 'paid';

rows 和 filtered 要一起看才反映真实过滤率

rows 是优化器估算的“需要扫描的行数”,但它不告诉你这些行里有多少被最终留下。filtered 字段(MySQL 5.7+)表示这个表在应用 WHERE 条件后,剩余行数占扫描行数的百分比。比如 rows=10000、filtered=10.00,说明只留下约 1000 行——过滤效率低,可能需要补条件或改索引顺序。

容易被忽略的点:

  • filtered 值极低(如 rows 也不高:说明扫描少但条件太松,结果集稀疏,未必是索引问题,可能是业务逻辑本身如此
  • filtered 接近 100% 但 rows 极高:说明索引没帮上忙,WHERE 条件根本没命中索引前缀,或者用了 LIKE '%xxx' 这类无法使用索引的写法

真正难的不是看懂单个字段,而是把 type、rows、filtered、Extra 放在一起交叉验证——同一句 SQL,在不同数据分布下,EXPLAIN 结果可能完全不同。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4103

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

871

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1069

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5981

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2883

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5960

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7961

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1090

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

952

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 182人学习