Skip to content

面试速答(先看这里)

**一句话结论:**这是一个比较简单的索引创建的问题,其实考察的点无非就是一个联合索引和最左前缀匹配,这里不涉及到区分度的问题、也不涉及到索引失效的问题。

60秒标准回答:

这是一个比较简单的索引创建的问题,其实考察的点无非就是一个联合索引和最左前缀匹配,这里不涉及到区分度的问题、也不涉及到索引失效的问题。所以还是比较简单的

需求要求支持三种查询,其中两个是单列查询,一个是多列查询。那么只需要建立2个索引就够了

1、建立用户id、日期的联合索引。来满足按照用户查询、和按照用户+日期查询,这样都可以走到这个索引上

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**需求要求支持三种查询,其中两个是单列查询,一个是多列查询。
  • **要点2:**1、建立用户id、日期的联合索引。
  • **要点3:**2、建立时间索引。
  • **要点4:**idx_user_date 联合索引中把用户放在最左边,就可以实现按照用户查询也能走到这个索引,同时按照用户+时间的查询也能走到这个索引。
  • **要点5:**另外,如果这张表中,用户的区分度不高,比如一共就没有多少用户,但是每个用户的单量很大,比如B类业务,那么可以考虑改一下索引:

**记忆锚点:**table_name → CREATE → INDEX → user → date → idx_user_date

加分表达:

  • 另外,如果这张表中,用户的区分度不高,比如一共就没有多少用户,但是每个用户的单量很大,比如B类业务,那么可以考虑改一下索引: 1、建立日期、用户id的联合索引。

追问准备:

  • 围绕「table_name」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「CREATE」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「INDEX」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

这是一个比较简单的索引创建的问题,其实考察的点无非就是一个联合索引和最左前缀匹配,这里不涉及到区分度的问题、也不涉及到索引失效的问题。所以还是比较简单的。

需求要求支持三种查询,其中两个是单列查询,一个是多列查询。那么只需要建立2个索引就够了。

1、建立用户id、日期的联合索引。来满足按照用户查询、和按照用户+日期查询,这样都可以走到这个索引上。

  • CREATE INDEX idx_user_date ON table_name (user, date);

2、建立时间索引。来满足按照时间查询。

  • CREATE INDEX idx_date ON table_name (date);

idx_user_date 联合索引中把用户放在最左边,就可以实现按照用户查询也能走到这个索引,同时按照用户+时间的查询也能走到这个索引。这样就可以减少重复的索引创建,用一个索引就能满足两个查询了。

另外,如果这张表中,用户的区分度不高,比如一共就没有多少用户,但是每个用户的单量很大,比如B类业务,那么可以考虑改一下索引:

1、建立日期、用户id的联合索引。来满足按照时间查询、和按照用户+日期查询,这样都可以走到这个索引上。

  • CREATE INDEX idx_date_user ON table_name (date,user);

2、建立用户索引。来满足按照用户查询。

  • CREATE INDEX idx_user ON table_name (user);