Yihui’s Blog

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

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

一句话答案

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

面试口语版

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

原理拆解

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

关键细节

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

面试官追问

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

高分补充

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

学习清单

  • 从选择性、读写比、字段宽度、重复性四点判断。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文