Yihui’s Blog

在什么情况下,不推荐为数据库建立索引?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #索引 #SQL优化 #VIP

一句话答案

小表、高频写且低频查询、低选择性字段、频繁更新的大字段、无法匹配真实查询模式或与现有索引重复时,不应盲目建立索引。

面试口语版

索引不是免费的。每个二级索引都会占空间,INSERT、DELETE 和索引列 UPDATE 都要维护 B+ 树,还可能增加页分裂、redo 和 binlog。数据量很小、查询本来就需要返回大部分行,或者性别、状态等低选择性字段单独查询时,全表扫描可能更划算。很长的文本、频繁变化的列也不适合随意建完整索引。最终应从慢 SQL 和查询模式出发,用联合索引覆盖高频条件,检查是否与现有索引重复,并在上线后观察真实使用率。

原理拆解

不推荐场景原因可能替代方案
小表或高比例返回全表扫描成本低不建或等待增长
高写低读维护成本大于查询收益缓存、异步查询
单独低选择性列过滤能力弱与高选择性条件建联合索引
超长文本索引大、维护贵前缀索引、全文检索
重复/被包含索引空间与写放大合并或删除冗余索引

关键细节

  • 低选择性列并非永远不能建索引,若查询只取极少数稀有值或能形成覆盖索引,仍可能有效。
  • 主键、唯一约束和外键相关索引还承担正确性或约束功能,不能只看查询次数。
  • 是否使用索引由优化器按成本决定,有索引不等于一定走索引。

面试官追问

  1. 性别字段一定不能建索引吗?
  2. 如何识别重复索引?
  3. 为什么索引会降低写性能?

高分补充

索引治理应记录创建原因、目标 SQL 和收益指标,并定期审计未使用和重复索引。

学习清单

  • 从选择性、读写比、字段宽度、重复性四点判断。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts