MySQL的索引是不是创建得越多越好?

1 个回答

  • 苏嫣然
    看山,看水,看众生,也看自己。
    ## 作用 MySQL 索引不是创建得越多越好。索引虽然可以提升查询效率,但也会带来额外成本: - **提高查询速度**:通过 B 树等结构快速定位数据,减少全表扫描。 - **带来约束能力**:主键索引要求非空且唯一,唯一索引要求值不重复。 - **降低写入性能**:执行 insert、update、delete 时,不仅要修改表数据,还要维护相关索引。 - **占用存储空间**:每个索引都需要额外磁盘空间,索引越多占用越大。 - **可能影响优化器选择**:不合理或冗余索引可能增加优化器判断成本,甚至导致查询执行计划不理想。 ## 原理 索引本质上类似图书目录,通过不断缩小数据查找范围来提升检索效率。MySQL 中多数索引存储在 B 树结构中,但索引需要随数据变更同步维护,因此数量过多会产生明显开销。 建立索引时通常应遵循以下原则: - **遵循最左前缀匹配**:使用联合索引时,查询条件应尽量符合索引列的最左前缀;遇到范围查询后,后续列可能无法继续使用索引。 - **选择区分度高的列**:区分度可理解为 `count(distinct col)/count(*)`,值越高,索引过滤效果越好;状态、性别等低区分度字段通常不适合单独建索引。 - **索引列不要参与计算或函数处理**:例如对索引字段使用函数,可能导致索引失效,应尽量把计算转换为对原始列的条件判断。 - **优先扩展已有索引,避免冗余索引**:已有 `(a)` 索引且查询需要 `(a,b)` 时,可考虑将原索引扩展为联合索引,而不是无节制新增索引。 - **根据实际查询场景设计**:索引应为高频查询、排序、关联、范围过滤等场景服务,而不是给每个字段都建索引。 因此,索引数量没有一个固定的最佳值,需要结合查询频率、写入压力、字段区分度、存储空间和执行计划综合评估。
    发布于 2026-10-29 05:44 •IP属地 贵州
    举报
    评论
    收藏