面试题答案
一键面试构建复合索引的一般原则
- 字段顺序:在复合索引中,字段的顺序非常关键。通常将选择性高(基数大,不同值多)的字段放在前面,这样能更快缩小搜索范围。例如,如果有一个
users
集合,其中country
字段值种类少,而email
字段值几乎各不相同,那么email
字段应放在复合索引靠前位置。 - 前缀匹配:复合索引遵循前缀匹配原则,即查询条件必须从索引的第一个字段开始依次匹配,才能有效利用索引。若索引为
{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"}
,由于不满足前缀匹配原则,索引无法有效利用,查询可能需要全表扫描,性能大幅下降。
适合使用复合索引的查询场景
- 多字段排序:比如在一个
products
集合中,经常需要按category
和price
排序展示商品列表。可以创建复合索引{category: 1, price: 1}
,这样排序操作可以高效利用索引,提升性能。 - 范围查询结合其他条件:假设
orders
集合中有order_date
和customer_id
字段,若经常查询某个客户在特定日期范围内的订单,如{customer_id: "123", order_date: {$gte: ISODate("2023 - 01 - 01"), $lte: ISODate("2023 - 12 - 31")}}
,则复合索引{customer_id: 1, order_date: 1}
可以优化查询。因为先按customer_id
快速定位客户相关订单,再在这些订单中按日期范围筛选,减少扫描数据量。