MST

星途 面试题库

面试题:MongoDB复合索引的顺序优化

在MongoDB中,对于集合orders,有字段order_date、customer_id和total_amount。如果有两种查询场景:一是按订单日期范围查询订单;二是按客户ID查询该客户的所有订单及其总金额。在创建复合索引时,应该如何考虑字段顺序以兼顾这两种查询场景的性能提升?详细阐述你的分析过程。
29.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

分析过程

  1. 按订单日期范围查询订单
    • 对于范围查询,在复合索引中,范围查询字段越靠前,索引的利用效率越高。如果按订单日期范围查询订单,order_date字段放在索引前面能更好地利用索引进行快速筛选。
  2. 按客户ID查询该客户的所有订单及其总金额
    • 这种查询属于等值查询,等值查询字段在复合索引中靠前能提高查询效率。所以customer_id字段在这种场景下放在索引前面较好。
  3. 兼顾两种查询场景
    • 由于范围查询对索引字段顺序更为敏感,并且在实际应用中,如果订单日期范围查询相对频繁,应该优先考虑满足订单日期范围查询的性能。
    • 因此,复合索引字段顺序应该是 order_date在前,customer_id 在后,total_amount 可以放在最后(因为它既不是范围查询字段也不是等值查询字段,在这两种查询场景中它主要是被返回的数据,而不是用于筛选的字段)。即创建复合索引为 {order_date: 1, customer_id: 1, total_amount: 1}。这里 1 表示升序,也可以根据实际情况选择降序 -1,但一般升序在大多数场景下能满足需求。

结论

创建复合索引 {order_date: 1, customer_id: 1, total_amount: 1} 能较好地兼顾这两种查询场景的性能提升。