MySQL索引设计核心注意事项
索引是MySQL优化的核心但设计不当会导致查询变慢、写入卡顿、空间浪费。下面按最实用、最容易踩坑的维度整理直接用于业务开发。一、基础原则什么时候该建索引1. 必须建索引的场景WHERE 条件频繁使用的列等值查询、范围查询JOIN 关联条件列内外键都建议建索引ORDER BY / GROUP BY 排序列DISTINCT 去重列覆盖查询查询只返回索引列不用回表2. 绝对不要建索引的场景列值重复率极高性别、状态0/1区分度20%数据量极小百行以内频繁修改、极少查询的表写入性能会暴跌单独的大字段text、blob、长varchar二、最关键联合索引设计规则70%的坑都在这1. 最左前缀原则必须死记联合索引(a, b, c)能命中的查询where a?where a? and b?where a? and b? and c?不能命中where b?where c?where a? and c?只能命中ab断层2. 联合索引顺序口诀等值在前范围在后区分度高在前低在后第1列高频等值查询、in第2列次高频条件最后一列范围查询 between like错误示例idx(created_time, status)范围在前索引失效正确示例idx(status, created_time)3. 控制联合索引列数建议2~4列最佳列越多索引体积越大、写入越慢、优化器越难选择。三、索引字段设计规范优先使用小数据类型int biginttinyint intshort string long string索引越小内存命中率越高速度越快。禁止在索引列上做计算/函数操作会导致索引完全失效❌ 错误where YEAR(create_time)2025✅ 正确where create_time 2025-01-01字符串必须加长度前缀索引避免整字符串建索引浪费空间-- 只索引前10个字符createindexidx_usernameonuser(username(10));允许 NULL 的列不适合建索引NULL 会让索引效率下降建议用默认值空字符串/0替代。四、查询与索引匹配注意事项like 以通配符开头会失效❌where name like %张三✅where name like 张三%隐式类型转换会导致索引失效字符串列传数字、数字列传字符串❌where phone13800138000phone是varchar✅where phone13800138000or 连接会导致索引失效or 前后必须全部有索引否则全表扫描尽量用 union all 替代。not in / ! / is not null 容易导致索引失效尽量避免或改用范围查询。五、写入性能索引不是越多越好每增一个索引insert/update/delete 就多一次索引维护单表索引数量建议3~5个以内频繁写入的表少建索引读多写少的表可以合理建索引六、高级优化覆盖索引性能神器查询的字段 索引字段不需要回表查数据行。示例-- 索引idx(status,created_time,nickname)-- 查询直接从索引返回无需回表selectnicknamefromuserwherestatus1andcreated_time2025-01-01覆盖索引能让查询速度提升5~100倍。七、必须避免的反模式高频坑单表建十几个索引→ 写入卡死每个字段单独建索引→ 优化器无法选择查询变慢联合索引顺序乱排→ 最左前缀失效大字段建索引→ 空间爆炸低区分度列建索引性别、状态→ 索引无用查询条件用函数/运算→ 索引直接失效八、索引维护与检查用explain检查是否命中索引删除重复、冗余、从未使用的索引大表加索引要在低峰期执行定期优化表optimize table总结最左前缀是联合索引的灵魂等值在前范围在后索引列不计算、不函数、不隐式转换单表索引不超过5个优先覆盖索引避免回表