一、前言索引是提升 MySQL 查询速度最直接的手段但日常开发中很多索引会出现失效问题即使建立索引SQL 语句依旧走全表扫描大表场景下查询耗时成倍增加。本文整理工作中高频遇到的索引失效场景附带可复现 SQL 案例与优化写法规范索引使用习惯适用于业务表 SQL 优化、慢查询治理场景。二、索引失效典型场景与优化查询条件字段参与运算、函数调用失效案例sql– create_time字段存在索引使用函数后索引失效select * from user_info where DATE(create_time) ‘2026-07-01’;失效原因数据库无法使用索引检索函数计算后的结果会全表遍历。优化写法调整条件让索引字段独立不参与计算sqlselect * from user_infowhere create_time ‘2026-07-01 00:00:00’and create_time ‘2026-07-02 00:00:00’;字符串字段查询不加引号隐式类型转换user_phone 为 varchar 类型且建有索引sql– 错误写法数字匹配字符串触发隐式转换索引失效select * from user_info where user_phone 13800138000;– 正确写法字符串匹配select * from user_info where user_phone ‘13800138000’;模糊查询前置百分号 % xxsql– 前置%无法走索引select * from user_info where user_name like ‘%张三’;– 后置%可以正常使用索引select * from user_info where user_name like ‘张三%’;业务需要全模糊匹配时可考虑全文索引、搜索引擎辅助处理。联合索引不遵循最左匹配原则建立联合索引 idx_name_age (user_name, age)sql– 缺少最左字段user_name索引失效select * from user_info where age 20;– 遵循最左前缀正常走索引select * from user_info where user_name ‘小明’ and age 20;使用、not in、is not null 等否定条件这类逻辑会大幅降低索引利用率数据分布分散时直接放弃索引扫描全表。优化思路拆分查询逻辑改用 in、等值匹配分页查询。三、索引设计通用规范区分度低的字段不建索引如性别、状态只有 0/1 两种值索引收益极低单表索引数量控制在 5 个以内过多索引会降低新增、更新语句执行速度联合索引将高频查询、区分度高的字段放在最左侧超长字符串不直接建索引可截取前缀建立前缀索引主键默认自带聚簇索引避免重复创建主键相关索引。四、验证索引是否生效的方法使用 explain 关键字解析 SQL 执行计划重点观察 type 字段type 为 all全表扫描未使用索引需要优化type 为 ref/range正常命中索引查询效率良好key 字段显示实际使用的索引名称无值代表索引失效。示例sqlexplain select * from user_info where user_name ‘小明’;五、总结索引优化是数据库性能调优的基础环节大部分慢查询根源都是索引使用不当。编码阶段规范 SQL 写法、合理设计索引结构能大幅减少线上慢 SQL 问题降低数据库服务器压力。日常迭代上线前建议对复杂查询 SQL 执行 explain 校验提前规避索引失效问题。