面试题答案
一键面试创建复合索引的原则
- 按照查询频率和选择性排序:将查询中最常使用且选择性高(即该字段不同值的数量多,能有效缩小查询范围)的字段放在复合索引的前面。例如,如果经常按
user_id
和created_at
进行查询,且user_id
的不同值远多于created_at
的不同值,那么索引应写成{user_id: 1, created_at: 1}
。 - 考虑排序需求:如果查询涉及对某些字段的排序操作,将排序字段按照排序方向(升序或降序)加入复合索引。例如,若查询需要按
price
降序排序,索引可写成{price: -1}
;若还需要按product_name
升序排序,则索引为{price: -1, product_name: 1}
。 - 避免冗余索引:确保复合索引不与已有的其他索引功能重复,避免创建过多冗余索引导致存储和维护成本增加。例如,若已经有一个
{user_id: 1}
的单字段索引,再创建{user_id: 1, other_field: 1}
的复合索引时要谨慎评估,除非other_field
也经常用于查询。
不同字段顺序复合索引对查询性能的影响
- 前缀匹配原则:MongoDB 复合索引遵循前缀匹配原则。例如,有复合索引
{a: 1, b: 1}
,查询{a: value1}
可以使用该索引,因为它匹配了索引的前缀;但查询{b: value2}
无法使用该索引,因为它没有从索引的第一个字段开始匹配。所以,将最常用的查询字段放在索引开头能使更多查询利用到索引。 - 多字段查询性能:对于多字段查询
{a: value1, b: value2}
,索引{a: 1, b: 1}
能高效地定位到满足条件的数据。但如果索引顺序是{b: 1, a: 1}
,查询效率可能会降低,因为 MongoDB 需要先按b
过滤,然后再按a
过滤,这可能需要扫描更多的数据页。 - 排序性能:当查询需要按多个字段排序时,索引字段顺序与排序顺序一致能提高性能。比如,按
price
降序和rating
升序排序,索引{price: -1, rating: 1}
能很好地支持该操作;若索引顺序是{rating: 1, price: -1}
,排序性能可能会受到影响。