MST

星途 面试题库

面试题:MongoDB中复合索引的构建原则

在MongoDB中,阐述构建复合索引的一般原则,例如字段顺序对查询性能的影响,并举例说明什么样的查询场景适合使用复合索引。
50.0万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

构建复合索引的一般原则

  1. 字段顺序:在复合索引中,字段的顺序非常关键。通常将选择性高(基数大,不同值多)的字段放在前面,这样能更快缩小搜索范围。例如,如果有一个users集合,其中country字段值种类少,而email字段值几乎各不相同,那么email字段应放在复合索引靠前位置。
  2. 前缀匹配:复合索引遵循前缀匹配原则,即查询条件必须从索引的第一个字段开始依次匹配,才能有效利用索引。若索引为{field1: 1, field2: 1},查询{field1: value1}{field1: value1, field2: value2}可以利用索引,但{field2: value2}则不能。

字段顺序对查询性能的影响

以复合索引{last_name: 1, first_name: 1}为例,如果查询{last_name: "Smith"},MongoDB可以直接利用索引定位到所有姓“Smith”的文档,性能较好。但如果查询{first_name: "John"},由于不满足前缀匹配原则,索引无法有效利用,查询可能需要全表扫描,性能大幅下降。

适合使用复合索引的查询场景

  1. 多字段排序:比如在一个products集合中,经常需要按categoryprice排序展示商品列表。可以创建复合索引{category: 1, price: 1},这样排序操作可以高效利用索引,提升性能。
  2. 范围查询结合其他条件:假设orders集合中有order_datecustomer_id字段,若经常查询某个客户在特定日期范围内的订单,如{customer_id: "123", order_date: {$gte: ISODate("2023 - 01 - 01"), $lte: ISODate("2023 - 12 - 31")}},则复合索引{customer_id: 1, order_date: 1}可以优化查询。因为先按customer_id快速定位客户相关订单,再在这些订单中按日期范围筛选,减少扫描数据量。