MST

星途 面试题库

面试题:MongoDB中复合索引的创建原则及对查询性能的影响

请阐述在MongoDB中创建复合索引的原则是什么?不同字段顺序的复合索引对查询性能会产生怎样不同的影响?
41.5万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

创建复合索引的原则

  1. 按照查询频率和选择性排序:将查询中最常使用且选择性高(即该字段不同值的数量多,能有效缩小查询范围)的字段放在复合索引的前面。例如,如果经常按 user_idcreated_at 进行查询,且 user_id 的不同值远多于 created_at 的不同值,那么索引应写成 {user_id: 1, created_at: 1}
  2. 考虑排序需求:如果查询涉及对某些字段的排序操作,将排序字段按照排序方向(升序或降序)加入复合索引。例如,若查询需要按 price 降序排序,索引可写成 {price: -1};若还需要按 product_name 升序排序,则索引为 {price: -1, product_name: 1}
  3. 避免冗余索引:确保复合索引不与已有的其他索引功能重复,避免创建过多冗余索引导致存储和维护成本增加。例如,若已经有一个 {user_id: 1} 的单字段索引,再创建 {user_id: 1, other_field: 1} 的复合索引时要谨慎评估,除非 other_field 也经常用于查询。

不同字段顺序复合索引对查询性能的影响

  1. 前缀匹配原则:MongoDB 复合索引遵循前缀匹配原则。例如,有复合索引 {a: 1, b: 1},查询 {a: value1} 可以使用该索引,因为它匹配了索引的前缀;但查询 {b: value2} 无法使用该索引,因为它没有从索引的第一个字段开始匹配。所以,将最常用的查询字段放在索引开头能使更多查询利用到索引。
  2. 多字段查询性能:对于多字段查询 {a: value1, b: value2},索引 {a: 1, b: 1} 能高效地定位到满足条件的数据。但如果索引顺序是 {b: 1, a: 1},查询效率可能会降低,因为 MongoDB 需要先按 b 过滤,然后再按 a 过滤,这可能需要扫描更多的数据页。
  3. 排序性能:当查询需要按多个字段排序时,索引字段顺序与排序顺序一致能提高性能。比如,按 price 降序和 rating 升序排序,索引 {price: -1, rating: 1} 能很好地支持该操作;若索引顺序是 {rating: 1, price: -1},排序性能可能会受到影响。