贝利信息

mysql索引不生效怎么排查_mysql执行计划分析方法

日期:2026-01-18 00:00 / 作者:P粉602998670
判断索引是否生效,首先看EXPLAIN的key列:NULL表示未使用索引,否则为实际使用的索引;需结合type(ALL为全表扫描)、possible_keys与key差异、函数操作(如YEAR())、联合索引最左匹配、字符串字段引号缺失等综合分析。

直接看 EXPLAINkey 列是否为 NULL

索引有没有生效,第一眼就看 EXPLAIN 输出里的 key 这一列:如果是 NULL,说明没走索引;否则就是用了某个索引。别信“我建了索引它就应该用”,MySQL 优化器会根据统计信息、数据分布、查询写法等综合判断——它可能觉得全表扫描更快。

日期字段上用了 YEAR()DATE() 等函数?立刻失效

对索引列做任何函数操作,MySQL 就无法用 B+ 树快速定位,只能扫全表。比如 YEAR(create_time) = 2025,哪怕 create_time 有索引也白搭。

联合索引没按最左前缀用?右边字段全作废

比如你建了 (sn, name, age) 联合索引,那只有以 sn 开头的查询才能触发它。单独查 nameage,或者 name AND age,索引完全不参与。

字符串字段没加引号?类型隐式转换让索引沉默

当索引列是 VARCHAR,而你在 WHERE 里写了数字(比如 WHERE sn = 123),MySQL 会把每行 sn 值转成数字再比——这等于对索引列做了函数操作,索引直接失效。

真正卡住人的,往往不是“没建索引”,而是“建了但根本没进优化器的法眼”——比如日期函数包裹、联合索引跳过首列、字符串漏引号。这些地方不翻 EXPLAIN,光看 SQL 写得“顺”,很容易误判。