根本原因是查询条件导致索引失效如函数操作、LIKE前导通配符、隐式类型转换、索引列运算或联合索引未遵循最左前缀原则FORCE INDEX仅适用于临时诊断治本需更新统计信息、重写SQL或优化索引设计。EXPLAIN 显示 typeALL 但明明有索引为什么没走根本原因往往不是 MySQL 拒绝用索引而是查询条件让索引失效。比如对 name 字段建了索引但写成 WHERE UPPER(name) ABCMySQL 无法下推函数计算到索引 B 树里只能全表扫描。常见踩坑点LIKE 开头带通配符WHERE name LIKE %abc —— 索引无法从左匹配直接失效隐式类型转换WHERE user_id 123user_id 是 INTMySQL 会把字段转成字符串比对放弃索引在索引列上做运算WHERE year(create_time) 2024哪怕 create_time 有索引也白搭联合索引顺序错位INDEX(a,b,c)但只查 WHERE b 1 AND c 2跳过最左前缀 a索引用不上用 FORCE INDEX 强制走某个索引靠谱吗靠谱但只该作为临时诊断或极少数明确优化场景的手段不是常规解法。MySQL 优化器选错索引通常意味着统计信息过期、数据分布异常或者 SQL 本身写法有问题。实操建议先运行 ANALYZE TABLE table_name 更新统计信息再看 EXPLAIN 是否改善确认 FORCE INDEX 后实际执行时间是否真变快——有时候强制走索引反而更慢比如返回 90% 行数时全表扫描可能比回表更快语法很简单SELECT * FROM users FORCE INDEX (idx_status_created) WHERE status 1 AND created 2024-01-01;注意如果强制的索引根本覆盖不了查询条件比如 WHERE 里用了没被索引的字段MySQL 仍会报错或退化为全表扫描USE INDEX 和 IGNORE INDEX 的真实作用边界USE INDEX 不是“必须用”而是“只允许从这些索引里选”IGNORE INDEX 是“禁止用这几个”但优化器仍可能选其他索引或全表扫。它们都只是约束选项不等于指令。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。