贝利信息

mysql索引的创建与维护最佳实践

日期:2026-01-19 00:00 / 作者:P粉602998670
该加索引时应依据查询条件和执行计划,优先为WHERE、JOIN、ORDER BY、GROUP BY中实际参与过滤或排序的列创建索引,结合EXPLAIN分析type、key、rows,避免盲目建索引。

什么时候该加索引:看查询条件和执行计划

不是所有字段都适合建索引,核心判断依据是 WHEREJOINORDER BYGROUP BY 中实际参与过滤或排序的列。盲目加索引反而拖慢写入性能,还浪费磁盘空间。

先用 EXPLAIN 看查询是否走了索引:

EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 'paid';

重点关注 type(最好是 refrange)、key(是否命中索引)、rows(扫描行数)。如果 typeALLrows 接近表总行数,大概率需要优化。

复合索引的列顺序怎么定:最左前缀原则不是玄学

MySQL 的 B+ 树索引依赖「最左前缀匹配」,意味着只有从索引最左边开始连续的列才能被用于查找。比如建了 (a, b, c) 索引:

所以列顺序要按「区分度(cardinality)高 → 经常出现在 WHERE 条件左侧 → 用于排序/分组的列靠后」来排。例如用户表中 city(低区分度)和 created_at(高区分度),应建为 (created_at, city) 而非反过来。

哪些操作会悄悄让索引失效

即使建了索引,以下写法会让优化器弃用它:

特别注意:JSON 字段上的虚拟列索引必须显式定义并建索引,否则 ->->> 表达式默认不走索引。

索引维护不是一劳永逸:定期检查和清理

索引不是建完就完事。随着数据增长和业务变化,有些索引可能长期未被使用,甚至成为写入瓶颈。

真正容易被忽略的是:索引统计信息过期会导致执行计划劣化。手动更新用 ANALYZE TABLE t;,生产环境建议开启 innodb_stats_auto_recalc = ON(默认已开),但大表仍建议每周夜间低峰触发一次 ANALYZE