面试知识库
进阶

联合索引设计原则#

一句话答案#

区分度高的列放前面,WHERE 常用列+ORDER BY 列+SELECT 覆盖列,范围查询列放最后。

核心要点

设计原则:

  1. 最左前缀:查询必须从最左列开始
  2. 区分度高的列在前(选择性高)
  3. 尽量覆盖索引(避免回表)
  4. 范围查询列放最后(>/<会中断后续列的索引使用)

经验公式: WHERE常用列 + ORDER BY列 + SELECT覆盖列

面试回答(2分钟版)

联合索引设计我遵循几个核心原则。首先是最左前缀原则,查询必须从联合索引的最左列开始才能用上索引。其次列的顺序很关键:等值查询的列放前面,区分度高的列优先,范围查询的列放最后,因为范围条件会中断后续列的索引使用。我的经验公式是”WHERE 常用列 + ORDER BY 列 + SELECT 覆盖列”,尽量凑成覆盖索引避免回表。实际项目中我会先分析慢查询日志找出高频 SQL,把它们的 WHERE、ORDER BY、SELECT 条件汇总起来,设计一两个联合索引覆盖大部分场景,一个好的联合索引能顶多个单列索引。同时要注意索引不是越多越好,每个索引都要占存储空间并且拖慢写入速度,一般单表索引控制在五六个以内。

追问与易错

追问方向:

  • “等值和范围列怎么排序?”→ 等值查询列放前面,范围查询列放最后;因为范围条件(>、<、BETWEEN)会中断后续列的索引使用,如 (status, age, name) 中 age 用范围则 name 失效
  • “怎么判断索引是否冗余?”→ 如果索引 A 是索引 B 的前缀则 A 冗余,如 (a) 和 (a,b) 共存时 (a) 多余;可用 pt-duplicate-key-checker 工具自动扫描冗余索引
  • “索引建多了有什么危害?”→ 每个索引都是一棵 B+ 树,占用磁盘空间;INSERT/UPDATE/DELETE 时需同步维护所有索引,写入性能下降;过多索引还增加优化器选择索引的开销

易错点:

  • ❌ 每个查询都建索引——合理设计联合索引一个顶多个
  • ❌ 忽略更新频率